如何使通过pip安装的Poetry打包脚本正常识别本地导入?
解决Poetry打包后本地导入失败的问题
问题原因
直接运行python src/scripttest.py时,Python会自动把脚本所在的src目录加入模块搜索路径,因此能直接导入同级的importantimport模块。但通过pip安装后,src目录被放到site-packages下,此时Python的模块搜索路径是site-packages,而非site-packages/src,所以直接import importantimport会找不到模块。
解决方案
方案1:修改导入语句为绝对导入
无需调整项目结构,直接修改src/scripttest.py的导入代码:
from src.importantimport import data def main(): print(data)
安装后,src作为顶层模块存在于site-packages中,这样的绝对导入能正确找到同级的importantimport模块。
方案2:调整为规范的Python包结构(推荐)
这种方式更符合Python包的标准结构,避免后续出现其他导入问题:
- 调整项目结构,将
src下的文件放入以包名命名的子目录,并添加__init__.py:
├── pyproject.toml ├── README.md └── src └── scripttest ├── __init__.py ├── importantimport.py └── scripttest.py
- 修改
pyproject.toml的配置:
name = "scripttest" version = "0.1.0" description = "" authors = [] packages = [ { include = "scripttest", from = "src" } ] [tool.poetry.dependencies] python = "^3.10" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" [tool.poetry.scripts] scripttest = 'scripttest.scripttest:main'
- 修改
src/scripttest/scripttest.py的导入方式(二选一即可):
- 相对导入:
from .importantimport import data def main(): print(data)
- 绝对导入:
from scripttest.importantimport import data def main(): print(data)
调整完成后重新执行pip install .,运行scripttest即可正常输出结果。
内容的提问来源于stack exchange,提问作者Kasami
相关产品推荐
相关产品推荐

