如何在Poetry管理的Python项目中按工作目录路径导入模块
解决Poetry项目中导入模块的ModuleNotFoundError问题
针对你的场景,有几种可行的解决方案,按推荐程度排序:
方法1:使用Poetry可编辑安装+run命令(推荐)
这是最符合Poetry工作流的方式,能让Python自动识别你的项目模块:
- 先以可编辑模式安装项目:
poetry install --editable
- 用Poetry的run命令执行脚本:
poetry run python scripts/main.py
原理:poetry install --editable会把项目根目录加入虚拟环境的Python路径,poetry run会确保执行脚本时使用这个配置好的环境。
方法2:手动添加项目根目录到sys.path
如果不想调整项目结构,可在scripts/main.py开头添加代码,手动让Python找到上层目录:
import sys from pathlib import Path # 将项目根目录(scripts的父目录)添加到Python搜索路径 sys.path.append(str(Path(__file__).parent.parent)) from module import my_function
原理:Path(__file__).parent.parent定位到my_project/目录,把它加入sys.path后,Python就能找到module.py了。
方法3:调整为Poetry标准项目结构(适合长期维护)
规范的Poetry项目会把业务代码放在与项目同名的子包中,调整后的结构如下:
my_project/ ├── pyproject.toml ├── my_project/ │ ├── __init__.py │ └── module.py └── scripts/ └── main.py
然后修改scripts/main.py的导入语句:
from my_project.module import my_function
执行poetry install后,用poetry run python scripts/main.py即可正常导入。这种结构更利于后续扩展模块、打包发布。
为什么原来的方法失败?
当你直接运行python scripts/main.py时,Python会自动将scripts/目录加入搜索路径(sys.path),但项目根目录my_project/不在其中,所以找不到module.py。添加__init__.py只是将目录标记为Python包,但不会自动让Python向上搜索父目录。
内容的提问来源于stack exchange,提问作者Matt Peng
相关产品推荐
相关产品推荐

