如何使用SVN和distutils为Python包分配版本号?

时间:2009-03-10 19:08:49

标签: python svn distutils

我正在编写一个Python包。程序包需要在内部知道其版本号,同时在setup.py distutils脚本中包含此版本。

这样做的最佳方法是什么,因此版本号不需要在两个不同的位置维护?我不想从我的库的其余部分导入setup.py脚本(这看起来相当愚蠢),我不想从setup.py脚本(同样)导入我的库。理想情况下,我只需在svn中设置一个关键字,然后自动将其替换为文件,但svn似乎无法实现。我可以在两个地方读取包含版本号的常见文本文件 - 这是最好的解决方案吗?

澄清:我想在一个位置维护版本号。是的,我可以在包中放置一个变量,然后再放在setup.py文件中。但那时他们不可避免地会失去同步。

4 个答案:

答案 0 :(得分:5)

在您的主程序包中,您可能有一个__init__.py,对吗?

目录结构:

> ./packageTest
>   ./packageTest/__init__.py
>   ./packageTest/setup.py

__init__.py文件中,添加以下行:

# package directory __init__.py
__version__ = 1.0

setup.py文件:

# setup.py
from packageTest import __version__
...

现在在从包目录导入的任何模块中(我将调用packageTest),你可以这样做:

from packageTest import setup
print 'Setup.py version:', setup.__version__  
# prints Setup.py version: 1.0

答案 1 :(得分:0)

在软件包中导入安装脚本很愚蠢(特别是因为安装库后它可能不再存在),但是在setup.py中导入库应该没问题。 单独的文本文件也可以使用,但是如果要在运行时访问版本号,则必须安装包文本文件。

答案 2 :(得分:0)

我的项目遇到了类似的问题。我编写了一个名为build.py的顶级test / build / package / deploy脚本(不是基于distutils的,请注意)。它读取properties file,其中包含集中版本号。我不是直接维护一个setup.py文件,而是保留一个template file,我的build.py脚本读取它,用来自props文件的值替换version变量,然后写出一个setup.py脚本。然后我的脚本文件将执行它,生成包或上传到pypi。

答案 3 :(得分:0)

另请参阅Standard way to embed version into python package?,其中介绍了如何将版本信息从一个位置(名为_version.py的文件)传播到其他代码查找的位置(例如,名为{{1的属性) }和__version__元数据)。

然后查看Brian Warner的new "versioneer" tool,它从修订控制历史记录中生成PEP 0345文件。

另外,请查看我对Standard way to embed version into python package?的回答,越多人意识到有办法解决这个问题,这样可以避免从设置脚本导入模块的问题,效果更好。