【问题标题】:Creating a __version__ attribute for python packages without getting into trouble为 python 包创建 __version__ 属性而不会遇到麻烦
【发布时间】:2013-07-21 10:02:41
【问题描述】:

在阅读了 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__

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

【问题讨论】:

标签: python package version


【解决方案1】:

一种解决方案是在 __init__.py 文件中定义 __version__ 并从 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 文件中定义的任何其他内容

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 是的,这听起来像是一种可行的破解方法!现在,我基本上在setup.py 中定义了一个版本号,在__init__.py 中定义了一个版本号——这可以正常工作,直到您在更新包时忘记更改其中任何一个...:P
    猜你喜欢
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    相关资源
    最近更新 更多