有没有一种标准的方法可以将版本字符串与Python包关联起来,这样我就可以执行以下操作?
import foo
print(foo.version)
我可以想象有某种方法可以在不进行任何额外硬编码的情况下检索数据,因为次要/主要字符串已经在setup.py
中指定了。我发现的另一种解决方案是在我的foo/__init__.py
中使用import __version__
,然后由setup.py
生成__version__.py
。
发布于 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
内幕
# 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
内幕
from .version import __version__
setup.py
内幕
exec(open('yourpackage/version.py').read())
setup(
...
version=__version__,
...
如果您知道其他更好的方法,请让我知道。
发布于 2014-01-26 05:15:36
我在包目录中使用了一个JSON文件。这符合Zooko的要求。
pkg_dir/pkg_info.json
内幕
{"version": "0.1.0"}
setup.py
内幕
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
内幕
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,因为我可以自动化元数据的管理。
发布于 2009-01-21 19:44:25
同样值得注意的是,__version__
也是半标准的。在python中,__version_info__
是一个元组,在简单的情况下,你可以这样做:
__version__ = '1.2.3'
__version_info__ = tuple([ int(num) for num in __version__.split('.')])
你可以从一个文件中获取__version__
字符串,或者其他任何东西。
https://stackoverflow.com/questions/458550
复制相似问题