如果您正在使用pbr,如何将软件包版本加载到__version__变量中?

6
为了简化Python打包,我正在尝试迁移到使用pbr。然而,我无法弄清如何将软件包的版本暴露到“__version__”变量中。这非常重要,因为我有很多软件包用户依赖于“version”变量的存在。人们应该能够执行:
import somemodule
print(somemodule.__version__)
2个回答

3

由于现有答案在一些安装设置方面不够清晰,所以这里提供一些更多的背景信息。

更新版本字符串

首先,如果手动跟踪版本,则在setup.cfg中更新您的版本字符串。

否则,如果从git仓库获取版本和其他信息:

  • 生成新的提交
  • 生成一个新的版本标签(如果不是开发版本)
  • 运行py setup.py sdist生成您的发布包并更新基于git信息的本地文件(AUTHORS、ChangeLog等)。

注意:从更新的Git标签生成新版本的最快命令是python setup.py install,但我看到有一个警告不要使用它。它对我来说工作得很好,但可能只是我的特定设置。使用sdistbdist_xxx将生成一个完整的分发包,如果您没有使用它,需要将其删除。

设置__init__.py文件

my_package/init.py

all = ('__version__',)

from pbr.version import VersionInfo

# Check the PBR version module docs for other options than release_string()
__version__ = VersionInfo('<my_package>').release_string()

然后,在使用该软件包的脚本中:

my_script.py

import my_package

print(my_package.__version__)

欲查看更多详细信息,请参考pbr.version模块文档


__init__.py 中的第一行不应该是 __all__ = ('__version__',) 吗?请注意,要加上逗号将值变成元组,而不是字符串。 - akaihola
1
@akaihola 是的,看起来没问题。已更新,但未经测试 - 我已开始使用Poetry包和poetry-dynamic-versioning来管理Python存储库中的版本。 - LightCC

3

我不确定这是否是最佳方法,但我发现另一个软件包正在做类似的事情:模拟

__all__ = (
    '__version__',
    'version_info'
)

from pbr.version import VersionInfo

_v = VersionInfo('mock').semantic_version()
__version__ = _v.release_string()
version_info = _v.version_tuple()

我觉得很奇怪/令人沮丧的是,当我在 setup.py 中使用 pbr 时,它不需要依赖关系,但当我尝试在我的命令行脚本中使用它时,我必须在 requirements.txt 中列出它。 - Lucas
@Lucas,"pbr不需要在setup.py中设置依赖项"这并不完全正确,实际上它被指定为设置依赖项:setup_requires=['pbr']。但同意这不是一个很干净的解决方案... - AuHau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接