Python项目(含src+Poetry)模块导入错误及结构优化咨询
带src目录的Poetry Python项目正确结构与跨包导入解决方法
正确项目结构
先给出标准的Poetry+src结构,确保主包betterhire下的所有子包可互相导入:
better-hire/ ├── pyproject.toml ├── poetry.lock ├── src/ │ └── betterhire/ │ ├── __init__.py # 主包标识文件 │ ├── data/ │ │ ├── __init__.py # 子包标识文件 │ │ └── models.py │ └── scraping/ │ ├── __init__.py # 子包标识文件 │ └── indeed.py └── tests/ # 可选测试目录 └── __init__.py
关键Poetry配置(pyproject.toml)
必须明确告诉Poetry主包的位置是src目录下的betterhire,否则Python无法识别跨包导入。在pyproject.toml中添加以下核心配置:
[tool.poetry] name = "betterhire" version = "0.1.0" authors = ["你的名字 <你的邮箱>"] # 核心配置:指定从src目录导入betterhire包 packages = [ { include = "betterhire", from = "src" }, ] [tool.poetry.dependencies] python = "^3.8" # 根据你的Python版本调整 [tool.poetry.dev-dependencies] pytest = "^7.0" # 可选测试依赖 [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api"
正确导入写法
在src/betterhire/scraping/indeed.py中使用绝对导入,直接从主包betterhire开始:
# src/betterhire/scraping/indeed.py from betterhire.data.models import Company
验证与运行注意事项
- 必须使用Poetry虚拟环境执行代码:要么先激活环境
poetry shell再运行脚本,要么直接用poetry run前缀:# 验证导入是否正常 poetry run python -c "from betterhire.scraping.indeed import Company; print('导入成功')" # 运行模块(推荐用-m参数,避免路径问题) poetry run python -m betterhire.scraping.indeed - 不要直接运行单个脚本文件(比如
python src/betterhire/scraping/indeed.py),这会把脚本所在目录加入Python路径,导致主包路径缺失。
常见避坑点
- 每个子包(
data、scraping)和主包都必须有__init__.py,虽然Python 3.3+支持无文件的命名空间包,但显式添加能避免Poetry环境下的路径识别问题。 - 尽量避免使用相对导入(比如
from ..data.models import Company),绝对导入更清晰,尤其适合跨包场景。 - 如果仍有导入问题,可运行
poetry install重新安装依赖并刷新路径,或用poetry show --tree确认包结构是否正确。
内容的提问来源于stack exchange,提问作者Aren Hovsepyan
相关产品推荐
相关产品推荐

