You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 14:43:10