在一个我的 python 包中,setup.py
是导入模块__about__.py
位于包内(存储所有元数据并希望在 pakcage 和设置之间共享它(。
setup.py
还为我的软件包安装其他依赖的第三方库。
同样在模块__init__.py
的包内导入了其他模块,如(from mypackage.mymodule import MyClass
(以保持简单用法(因为更容易编写import mypackage
然后a = mypackage.MyClass()
(。
问题是,如果setup.py
导入__about__.py
那么也从包和更深的所有内容__init__.py
执行,这会在安装过程中生成导入错误,因为仍然没有安装我的依赖库。
结构为:
setup.py
mypackage/
__init__.py
__about__.py
mymodule.py
我想保持相同的用法并保持结构,但如果之前没有安装依赖模块,则在安装过程中解决导入问题。 可能最好的方法是在不执行__init__.py
的情况下导入mypackage.__about__
,但是如何执行呢?
或任何其他建议都是受欢迎的。
该软件包仅为 python3。
实际上,我通过将setup.py
中的import mypackage.__about__
替换为exec找到了解决方案:
_ABOUT = {}
exec(open('mypackage/__about__.py').read(), _ABOUT)
setuptools.setup(
name=_ABOUT['NAME'],
version=_ABOUT['VERSION'],
...
文件__about__.py
包含:
NAME = 'mypackage'
VERSION = 'v1.0.0'
...
此解决方案运行良好。只有一个小问题是 PEP 警告 W0122