首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将版本嵌入到Python包中的标准方法?

将版本嵌入到Python包中的标准方法?
EN

Stack Overflow用户
提问于 2009-01-20 02:05:54
回答 9查看 187K关注 0票数 318

有没有一种标准的方法可以将版本字符串与Python包关联起来,这样我就可以执行以下操作?

代码语言:javascript
复制
import foo
print(foo.version)

我可以想象有某种方法可以在不进行任何额外硬编码的情况下检索数据,因为次要/主要字符串已经在setup.py中指定了。我发现的另一种解决方案是在我的foo/__init__.py中使用import __version__,然后由setup.py生成__version__.py

EN

回答 9

Stack Overflow用户

发布于 2013-04-18 21:50:57

重写2017-05

在13+多年编写Python代码和管理各种包之后,我得出结论,自己动手可能不是最好的方法。

我开始使用pbr包来处理包中的版本控制。如果您使用git作为您的SCM,这将像魔法一样适合您的工作流程,节省您数周的工作(您会惊讶地发现这个问题是多么复杂)。

到今天为止,pbr has 12M mongthly downloads和达到这个级别不包含任何肮脏的把戏。只有一件事--以一种非常简单的方式修复一个常见的包装问题。

pbr可以承担更多的包维护负担,并且不限于版本控制,但它不会强迫您采用它的所有好处。

因此,为了让您了解一下在一次提交中采用pbr是什么样子,请看一下switching packaging to pbr

您可能会注意到,该版本根本没有存储在存储库中。PBR确实从Git分支和标记中检测到它。

无需担心当您没有git存储库时会发生什么,因为当您打包或安装应用程序时,pbr会“编译”并缓存版本,因此不存在对git的运行时依赖。

旧的解决方案

这是我到目前为止看到的最好的解决方案,也解释了为什么:

yourpackage/version.py内幕

代码语言:javascript
复制
# Store the version here so:
# 1) we don't load dependencies by storing it in __init__.py
# 2) we can import it in setup.py for the same reason
# 3) we can import it into your module module
__version__ = '0.12'

yourpackage/__init__.py内幕

代码语言:javascript
复制
from .version import __version__

setup.py内幕

代码语言:javascript
复制
exec(open('yourpackage/version.py').read())
setup(
    ...
    version=__version__,
    ...

如果您知道其他更好的方法,请让我知道。

票数 118
EN

Stack Overflow用户

发布于 2014-01-26 05:15:36

我在包目录中使用了一个JSON文件。这符合Zooko的要求。

pkg_dir/pkg_info.json内幕

代码语言:javascript
复制
{"version": "0.1.0"}

setup.py内幕

代码语言:javascript
复制
from distutils.core import setup
import json

with open('pkg_dir/pkg_info.json') as fp:
    _info = json.load(fp)

setup(
    version=_info['version'],
    ...
    )

pkg_dir/__init__.py内幕

代码语言:javascript
复制
import json
from os.path import dirname

with open(dirname(__file__) + '/pkg_info.json') as fp:
    _info = json.load(fp)

__version__ = _info['version']

我还在pkg_info.json中放入了其他信息,比如作者。我喜欢使用JSON,因为我可以自动化元数据的管理。

票数 13
EN

Stack Overflow用户

发布于 2009-01-21 19:44:25

同样值得注意的是,__version__也是半标准的。在python中,__version_info__是一个元组,在简单的情况下,你可以这样做:

代码语言:javascript
复制
__version__ = '1.2.3'
__version_info__ = tuple([ int(num) for num in __version__.split('.')])

你可以从一个文件中获取__version__字符串,或者其他任何东西。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/458550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档