构建Python包时setup.py导入失败问题求助
问题根源与解决方案
核心问题
你遇到的冲突是两种运行场景下Python的sys.path不同:
- 直接运行内层
tests.py时,Python会把当前目录(内层cool_package)加入sys.path,所以import module1/module2能直接找到同目录下的模块。 - 运行外层
setup.py时,Python的sys.path只包含setup.py所在的外层目录,此时module1里的import module2会尝试寻找顶层的module2模块,而非cool_package子目录下的,因此报错。
分步解决方案
1. 统一包内模块的相对导入规范
包内部的模块之间必须使用相对导入,这是Python包的标准做法:
- 修改
module1.py的导入代码:from . import module2 - 如果你的
__init__.py是从module1导入函数,也改成相对导入:from .module1 import your_function1, your_function2
2. 修正测试脚本的运行方式
直接运行tests.py会导致它被当作顶层脚本,无法识别相对导入。你需要从外层目录(包含setup.py的那个目录),以模块方式运行测试:
python -m cool_package.tests
同时,把tests.py的导入也改成相对或绝对导入:
# 相对导入方式(推荐,符合包结构) from . import module1, module2 # 或者绝对导入方式 import cool_package.module1 as module1 import cool_package.module2 as module2
3. 正确配置setup.cfg
你的setup.cfg配置是有效的,只需要确保格式正确(注意空格),让setuptools能正确找到包:
[options] packages = find: package_dir = = cool_package [options.packages.find] where = cool_package
setup.py保持原有的极简版本即可,不需要额外添加py_modules或package_dir参数,因为配置已经在setup.cfg里定义了。
4. 验证安装与运行
从外层目录执行开发模式安装(方便调试):
pip install -e .
安装后,无论是运行setup.py还是在其他地方导入cool_package,都不会再出现模块找不到的问题。
内容的提问来源于stack exchange,提问作者Bob Smith
相关产品推荐
相关产品推荐

