21

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

我最终从一个单独的文件中导入了版本属性。

所以我的“版本”文件通常是

my_package/
    __init__.py
    my_module1/
        ...
    my_module2/
        ...
    my_module3/
        ...
    info/
        __init__.py
        version.py
            __version__ = '0.1.0'

在最上面__init__.py我从以下位置导入__version__属性info.version

import __version__

这样人们就可以通过

my_package.__version__

我只是想知道这是否是一种“好的”方法,以及是否有人反对这样做?我期待您的意见和建议!

4

2 回答 2

11

一种解决方案是__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),
    ...,
)

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

于 2016-12-12T21:42:35.317 回答
1

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

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

于 2015-01-07T20:26:00.967 回答