发布到PyPI的Python包跨文件导入失败如何解决?
问题根因
这是Python导入路径解析规则差异导致的:
你本地运行时大概率是直接在package目录下执行脚本,当前工作目录会被自动加入sys.path,所以能直接找到A.py;但包发布安装后,导入路径基于包的顶层安装目录,你的两种写法都不符合标准的包导入规范。
解决方案
方案1:使用包内相对导入(优先推荐)
直接在B.py中写:
from .A import function
注意该写法仅在将代码作为包导入时生效,不能直接在package目录下以顶层脚本方式运行B.py,如果需要单独测试B.py,请在包的外层目录用如下命令执行:python -m package.B
方案2:使用正确配置的绝对导入
如果要使用绝对导入写法from package.A import function,需要先确认你的打包配置符合要求:
- 检查
pyproject.toml/setup.py中的包声明配置,比如用setuptools的话需要配置packages = find:来自动识别包目录 - 确认打包时的顶层目录是
package所在的目录,不要额外嵌套外层目录
配置正确后绝对导入写法即可正常生效。
本地测试注意事项
本地开发时尽量不要进入package目录内直接运行脚本,避免工作目录被加入路径导致和安装后的运行逻辑不一致,所有测试都在包的外层目录执行,模拟用户安装后的导入场景。
内容的提问来源于stack exchange,提问作者Tito Diego
相关产品推荐
相关产品推荐

