在我的所有Python模块文件中,我将模块版本放在__version__
。
现在如果我发布我的Python库,我想自动在所有Python模块文件中增加这个模块版本。
我知道我可以访问模块的版本,如下所示:
mymodule.py:
# my module
__version__ = "0.0.1"
usesmymodule.py:
import mymodule
# Gives me "0.0.1"
print mymodule.__version__
现在我如何在更改版本后保存模块源文件?用这样的方式:
mymodule.__version__ = "0.0.2"
mymodule.__save__() # does not exist as such, but thats what I want
我当然可以应用类似sed的机制,逐行读取源文件并替换__version__
- 我已经有了一个Bash脚本。但我想替换那个Bash脚本并以更Pythonic的方式增加模块版本。你知道吗?
答案 0 :(得分:3)
改变变量并更新源代码并不是一种简洁的方法。程序运行后,你不知道变量是来自一个简单的赋值,一个函数调用,一个if语句内的东西等。有一些方法可以解析代码而不运行它,编辑AST,然后写它退出了,但它很复杂且不方便。
三个实用的解决方案:
__version__
- 只是在库的顶层。__version__
并在其他地方引用它,例如from .versionno import __version__
。答案 1 :(得分:1)
奇怪的是,使用sed几乎可以被认为是Pythonic,因为它绝对是工作的正确工具。
答案 2 :(得分:0)
我同意托马斯和伊格纳西奥的答案 - 尤其是我应该只在一个中心位置拥有该版本号。 但是对于不能选择的模块(或者在我的情况下 - 懒惰),我现在自己写了一个使用Bash / sed的替代方法。它工作得很好,可以集成到更大的Python构建脚本中:
import fileinput
def replace_version(filename, version):
'''Replace version in file with new version'''
for line in fileinput.FileInput(filename,inplace=1):
if line.startswith('__version__'):
print('__version__ = \'%s\'' % version)
else:
sys.stdout.write(line)
replace_version('mymodule.py', '0.0.2')