【发布时间】:2020-01-31 19:34:04
【问题描述】:
我有一个 Python 包,其结构如下:
├── setup.cfg
├── setup.py
└── src
└── myproject
├── base.py
├── __init__.py
└── version.py
在setup.cfg中,版本是用attr定义的:
[metadata]
name = myproject
version = attr: myproject.version.__version__
version.py 很简单:
__version__ = "1.2.3"
包的依赖项列在setup.cfg 中。另一方面,包的顶层__init__.py 导入包的一些对象:
from myproject.base import Stuff
__all__ = ["Stuff"]
而且,很明显,base.py 从依赖项中导入了一些对象。
现在的问题是,如果我在未安装依赖项的情况下尝试使用python setup.py,我有一个ModuleNotFoundError/ImportError,因为__init__.py 导入了导入这些依赖项的对象(这非常适合案例6在the Python documentation on managing version file):
python setup.py --version
Traceback (most recent call last):
<snip>
ModuleNotFoundError: No module named 'dependency_module'
这使得无法安装依赖项。那么针对版本文件的最佳策略应该是什么?
到目前为止,我已经在__init__.py 上尝试过这种奇怪的异常处理方法:
try:
from myproject.base import Stuff
except ImportError:
pass
有没有更好的方法?还是其他方法?
【问题讨论】:
-
您的 setuptools 版本是多少?
version = attr: myproject.version.__version__至少应该是39.2.0才能工作。 -
版本高于40.0.0。
-
看起来像 github.com/pypa/setuptools/issues/1724 。我真的很惊讶,从我的角度来看,它首先破坏了拥有
version = attr: myproject.version.__version__功能的点。我有点迷茫…… -
是的,我完全同意!这个错误绝对是合乎逻辑的,但如果你使用
attr:,这是不可避免的。 -
看来
attr:的情况同时有所改善:github.com/pypa/setuptools/pull/1753 -- 好像已经在v46.4.0 on 16 May 2020发布了
标签: python-3.x setuptools setup.py