我正在为我一直从事的项目过渡到基于包的工作流程。我希望能够将开发环境和生产环境分开,我认为 setuptools 在一定程度上提供了这种可能性。
我有一个结构如下的项目:
modulename/
setup.py
modulename/
file_a.py
script.py
在 script.py 中,我想导入 file_a.py。目前我通过 import file_a
来做到这一点。
我的 setup.py 看起来像:
from setuptools import setup, find_packages
setup(name='modulename',
packages = find_packages(),
package_dir = {'': '../modulename'},
scripts = ['modulename/script.py'])
目前,当我在完成 python setup.py install
后运行 script.py
时,我收到一条错误消息:
SystemError: 父模块 '' 未加载,无法执行相对导入
我已经尝试了 package_dir = ...
的各种排列,最著名的是 package_dir = {'': 'modulename'}
,但这会引发另一个错误安装,错误:包目录 'modulename/modulename' 不存在
我不确定我做错了什么。 setuptools 的在线文档在处理涉及相对导入的情况时相对较差。有人可以指出我正确的方向吗?
最佳答案
此问题与 setuptools
无关。在作为 __main__
执行的模块中使用相对导入不是开箱即用的。有变通办法/技巧,但最常见的解决方案似乎是将脚本移出包或在脚本文件中使用绝对导入。
看看Relative imports in Python 3完整的故事。
关于使用带有脚本的 setuptools 的 Python 相对导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39455388/