我希望将我的包的__version__个保存在__init__可以访问的单个源文件中,并且能够在setup中导入它,而不依赖于包的依赖项.

假设我有一个包,其中包含一个带有版本1.0.0的模块module_a,并且只有一个依赖项module_b.

module-a/src/module_a/__init__.py:

__version__ = `1.0.0`

from module_a.inner.foo import bar

module-a/src/module_a/inner/foo.py:

from module_b import baz
...
def bar():
   baz.do_something()

module-a/setup.py:

from setuptools import setup
from module_a import __version__

setup(
    version=__version__,
    ...,
)

现在,当我想要将module_a更新到版本1.0.1时,我只需要更新__init__.py,而不是setup.py.

现在的问题是,setup依赖于module-b的安装,这是不好的.

我目前的解决办法是: module-a/src/module_a.__init__.py:

__version__ = `1.0.0`

try:
    from module_a.foo import bar
except ImportError:
    # this should happen only when import __version__, __name__ from setup.py
    pass

现在设置不依赖于module-b:) 但问题是,如果出于某种原因 from module_a.inner.foo import bar失败(例如,在未安装-module-b的情况下)导入将静默失败,不会引发适当的异常,并且无法从module_a访问module_a.foo.

有没有合适的方法来解决这个问题?

推荐答案

我使用的方法与@Farhood在一些已发布的包中建议的方法类似:

还有一个单独的version.py,可以独立进口.

程序包根级别__init__简单地执行

from version import __version__

setup.py使用进口机械从相同的地方加载版本.重要的部分如下:

from importlib.util import spec_from_file_location, module_from_spec

spec = spec_from_file_location('version', join(dirname(__file__) or '.', 'src', 'haggis', 'version.py'))
mod = module_from_spec(spec)
spec.loader.exec_module(mod)
# use mod.__version__

Python相关问答推荐

Django注释:将时差转换为小数或小数

Numpy索引argsorted使用integer数组,同时保留排序顺序

NumPy中的右矩阵划分,还有比NP.linalg.inv()更好的方法吗?

将HTML输出转换为表格中的问题

使用scipy. optimate.least_squares()用可变数量的参数匹配两条曲线

如何在Deliveryter笔记本中从同步上下文正确地安排和等待Delivercio代码中的结果?

使用Keras的线性回归参数估计

Python中的嵌套Ruby哈希

Python,Fitting into a System of Equations

OR—Tools CP SAT条件约束

pandas在第1列的id,第2列的标题,第3列的值,第3列的值?

让函数调用方程

如何排除prefecture_related中查询集为空的实例?

python sklearn ValueError:使用序列设置数组元素

如何将数据帧中的timedelta转换为datetime

如何从pandas DataFrame中获取. groupby()和. agg()之后的子列?

Flask运行时无法在Python中打印到控制台

如何合并具有相同元素的 torch 矩阵的行?

在Python中控制列表中的数据步长

计算机找不到已安装的库'