Python 从git标签获取版本(通过pbr)

Python 从git标签获取版本(通过pbr),python,versioning,Python,Versioning,我用它来包装。它从git标记获取版本,并将其应用于setup.py 现在我还想在包中提供这个版本。例如,要有一个\uuuuuuuuuuuuuuuuuuuuu属性。我可以为此使用pbr库吗 还有另一个库:它也从git标记中提取版本,但这会增加额外的要求。我更愿意从pbr获取此功能,如果您认为pbr是软件包的运行时依赖项,那么您可以使用pbr.version中的类: from pbr.version import VersionInfo package_name='my_package' info

我用它来包装。它从git标记获取版本,并将其应用于setup.py

现在我还想在包中提供这个版本。例如,要有一个
\uuuuuuuuuuuuuuuuuuuuu
属性。我可以为此使用
pbr
库吗


还有另一个库:它也从git标记中提取版本,但这会增加额外的要求。我更愿意从
pbr

获取此功能,如果您认为
pbr
是软件包的运行时依赖项,那么您可以使用
pbr.version
中的类:

from pbr.version import VersionInfo

package_name='my_package'
info = VersionInfo(package_name)

print(info.version_string())
(另请参见)

考虑,如果可用,它会从git或hg标签中提取一个版本,或者生成适当的开发版本(例如,
hgvs-1.2.5.dev6+hb5d989061852.d20181124
)。该版本与硬编码版本一样写入包元数据。不需要非标准运行时支持

虽然我在许多项目中使用过setuptools\u scm,但我没有使用PBR。我很好奇,制作了这个简单的演示:

snafu$ head setup.py setup.cfg pbrversiontest/*.py
==> setup.py <==
from setuptools import setup

setup(
    setup_requires=[
        "pbr",
        "setuptools_scm"
    ],
    pbr=True,
    use_scm_version=True,
)

==> setup.cfg <==
[metadata]
name = pbrversiontest
summary = test whether we can use pbr and setuptools_scm

[files]
packages =
    pbrversiontest

==> pbrversiontest/__init__.py <==
# This is straight from setuptools_scm README
from pkg_resources import get_distribution, DistributionNotFound
try:
    __version__ = get_distribution(__name__).version
except DistributionNotFound:
    # package is not installed
    pass

==> pbrversiontest/__main__.py <==
# this isn't required -- only for the demo
import pbrversiontest

print("version is " + pbrversiontest.__version__)

正确设置
setuptools
pbr
后,以下是几种方法:

import pkg_资源#setuptools的一部分
#我不喜欢这个,因为version方法是隐藏的
v1=pkg\u资源。需要(“我的\u包\u名称”)[0]。版本
打印('v1{}'。格式(v1))
#这是我最喜欢的-没有.version的输出只是一个较长的字符串,带有
#包名称、空格和版本字符串
v2=pkg\u资源。获取\u分发(“我的\u包\u名称”)。版本
打印('v2{}'。格式(v2))
从pbr.version导入VersionInfo
#这一个似乎比较慢,而pyinstaller使exe变得更大
v3=VersionInfo('my_-package_-name')。release_-string()
打印('v3{}'。格式(v3))
#更新,自Python 3.8起的新选项(信用:sinoroc)
#在Python 3.8中,importlib.metadata是stdlib的一部分,
#它删除了对“pbr”或“setuptools”的运行时依赖关系`
导入importlib.metadata
__version\uuu=importlib.metadata.version('my\u package\u name')
如果需要从命令行执行此操作,可以执行以下操作:

py setup.py--版本
或者甚至从脚本中运行setup.py脚本(如果软件包始终在本地安装):

从子流程导入Popen,管道
(输出,错误)=Popen('py setup.py--version'.split(''),
stdout=PIPE,stderr=PIPE,text=True)
if err:print('ERROR:{}'.format(err))
else:print('setup.py--version={}'。格式(输出))
注意:有关使用子流程启动和读取标准输出等的更多详细信息,请参阅,尤其是在Python的旧版本(3.7之前)上

然后,您可以将
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuu版本
添加到包
\uuuuuuuu init\uuuuuuuuuuuuuuy.py
中,如下所示:

\uuuuuuuuuuuuuuuuuuuuuuuuuu=(
'版本'',
“我的包名”
)
#或者替换其他方法并将结果分配给_版本__
导入软件包资源#setuptools的一部分
__version\uuuu=pkg\u resources.get\u分发(“我的\u包\u名称”).version

其他一些问答可能有助于设置以及更新版本和其他信息的详细信息,特别是从Git repo获取信息(来自标签、作者和变更日志信息的版本)时:


pbr是否已经是一项“额外要求”?这是一项要求,但无论如何,我都会将其用于包装。它从git获取大量信息,满足DRY原则(作者、变更日志等)。它所做的一件事是生成一个用于setup.py的版本。只是想找到一种方法来利用它。这样设置的优点是scm成为版本标记的唯一/权威来源。这使得代码很难歪曲其版本号(或prd/dev/rc状态)。
snafu$ python3.6 -mvenv venv/3.6
snafu$ source venv/3.6/bin/activate
(3.6) snafu$ git tag 0.1.2
(3.6) snafu$ pip install -e .
(3.6) snafu$ python -m pbrversiontest 
version is 0.1.2
(3.6) snafu$ pip install wheel
(3.6) snafu$ python setup.py bdist_wheel
...
creating 'dist/pbrversiontest-0.1.2-py3-none-any.whl' and adding 'build/bdist.linux-x86_64/wheel' to it
...
(3.6) snafu$ unzip -l dist/pbrversiontest-0.1.2-py3-none-any.whl 
Archive:  dist/pbrversiontest-0.1.2-py3-none-any.whl
  Length      Date    Time    Name
---------  ---------- -----   ----
      192  2018-11-25 05:26   pbrversiontest/__init__.py
       73  2018-11-25 05:46   pbrversiontest/__main__.py
       33  2018-11-25 06:06   pbrversiontest-0.1.2.dist-info/AUTHORS
      217  2018-11-25 06:06   pbrversiontest-0.1.2.dist-info/METADATA
       92  2018-11-25 06:06   pbrversiontest-0.1.2.dist-info/WHEEL
       47  2018-11-25 06:06   pbrversiontest-0.1.2.dist-info/pbr.json
       15  2018-11-25 06:06   pbrversiontest-0.1.2.dist-info/top_level.txt
      675  2018-11-25 06:06   pbrversiontest-0.1.2.dist-info/RECORD
---------                     -------
     1344                     8 files