更改模块__version__并在之后保存带有更新版本的模块源文件

时间:2012-02-21 16:53:11

标签: python

在我的所有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的方式增加模块版本。你知道吗?

3 个答案:

答案 0 :(得分:3)

改变变量并更新源代码并不是一种简洁的方法。程序运行后,你不知道变量是来自一个简单的赋值,一个函数调用,一个if语句内的东西等。有一些方法可以解析代码而不运行它,编辑AST,然后写它退出了,但它很复杂且不方便。

三个实用的解决方案:

  • 我使用的大多数库在每个模块中都没有__version__ - 只是在库的顶层。
  • 您可以在一个地方设置__version__并在其他地方引用它,例如from .versionno import __version__
  • 正如伊格纳西奥所说,如果你必须在每个文件中写下它,请使用sed或类似的东西,并保持简单。

答案 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')