从包中获取pip / setuptools版本的包?

时间:2014-03-24 08:57:09

标签: python setuptools

我有一个使用setuptools的软件包进行部署。我希望在程序包(CLI工具)中有一个函数来报告程序包的版本。这应报告version调用中使用的setup字段。有没有办法可以在已安装的软件包上访问此值?

例如,我的setup.py使用setup调用version = '0.1.6'并安装命令行工具tool。我希望调用tool --version打印版本0.1.6

1 个答案:

答案 0 :(得分:2)

在您的软件包的主__init__.py文件中列出此内容通常很常见。例如,如果您的包名为sample,并且位于sample目录中,那么您将拥有一个sample/__init__.py文件,其中包含以下内容:

__version__ = '0.1.6'

def version():
    return __version__

然后在CLI界面中使用它。

setup.py中,如果您希望从代码中读取此值以便不创建冗余,请执行以下操作:

import os.path

here = os.path.abspath(os.path.dirname(__file__))

# Read the version number from a source file.
# Why read it, and not import?
# see https://groups.google.com/d/topic/pypa-dev/0PkjVpcxTzQ/discussion
def find_version(*file_paths):
    # Open in Latin-1 so that we avoid encoding errors.
    # Use codecs.open for Python 2 compatibility
    with codecs.open(os.path.join(here, *file_paths), 'r', 'latin1') as f:
        version_file = f.read()

    # The version line must have the form
    # __version__ = 'ver'
    version_match = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]",
                              version_file, re.M)
    if version_match:
        return version_match.group(1)
    raise RuntimeError("Unable to find version string.")

setup(
    name="sample",
    version=find_version('sample', '__init__.py'),
    # ... etc

有关实现此类目标的不同方法的更多讨论,请查看http://packaging.python.org/en/latest/tutorial.html#version