为python包创建__version__属性而不会遇到麻烦

15 python version package

在阅读了python文档(http://www.python.org/dev/peps/pep-0396/)之后,我对如何正确设置__version__包的属性感到困惑.有人提到将它们放入setup.py文件中,这让我感到困惑:它不可用my_package.__version__,是吗?

我最终从一个单独的文件中导入了version属性.

所以我的"版本"文件通常是

my_package/
    __init__.py
    my_module1/
        ...
    my_module2/
        ...
    my_module3/
        ...
    info/
        __init__.py
        version.py
            __version__ = '0.1.0'
Run Code Online (Sandbox Code Playgroud)

并在最上面__init__.py我导入__version__属性info.version:

import __version__

这样一来就可以获得版本号

my_package.__version__
Run Code Online (Sandbox Code Playgroud)

我只是想知道这是否是一个"好的"方法,如果有人反对这样做呢?我期待着您的意见和建议!

Eri*_*lum 5

一种解决方案是__version____init__.py文件中定义,然后从setup.py中读取。这意味着您只需要在一个位置更改版本。我写了一个小函数来做到这一点:

from setuptools import setup
import re

def get_property(prop, project):
    result = re.search(r'{}\s*=\s*[\'"]([^\'"]*)[\'"]'.format(prop), open(project + '/__init__.py').read())
    return result.group(1)

project_name = 'YOUR PROJECT'
setup(
    ...,
    version = get_property('__version__', project_name),
    ...,
)
Run Code Online (Sandbox Code Playgroud)

您还可以使用它来获取文件中__author__定义的类似内容或其他内容__init__.py


小智 0

您还没有说明如何将版本号获取到 setup.py 中,但不要尝试使用通常的import my_package方法导入它。当您运行 setup.py 时,您的软件包尚未安装!

我通常的方法是在 setup.py 中定义版本号,并__init__.py在版本号更改时让 setup.py (重新)生成包的顶级文件。__init__.py如果文件不包含其他代码,这很容易做到。