我正在编写一个Python包。程序包需要在内部知道其版本号,同时在setup.py
distutils
脚本中包含此版本。
这样做的最佳方法是什么,因此版本号不需要在两个不同的位置维护?我不想从我的库的其余部分导入setup.py
脚本(这看起来相当愚蠢),我不想从setup.py
脚本(同样)导入我的库。理想情况下,我只需在svn
中设置一个关键字,然后自动将其替换为文件,但svn
似乎无法实现。我可以在两个地方读取包含版本号的常见文本文件 - 这是最好的解决方案吗?
澄清:我想在一个位置维护版本号。是的,我可以在包中放置一个变量,然后再放在setup.py
文件中。但那时他们不可避免地会失去同步。
答案 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?的回答,越多人意识到有办法解决这个问题,这样可以避免从设置脚本导入模块的问题,效果更好。