2012-02-21 2 views
0

私のすべてのPythonモジュールファイルには、__version__のモジュールバージョンを入れました。モジュール__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スクリプトを置き換え、よりPythonの方法でモジュールのバージョンを増やしたいと思います。あなたは何か知っていますか?

答えて

3

実際には、変数を変更してソースコードを更新するためのきちんとした方法はありません。プログラムが実行された後、変数が単純な代入、関数呼び出し、if文内のものかどうかは分かりません。コードを実行せずに解析したり、ASTを編集したり、それは後退しますが、それは複雑で不便です。

三実用的なソリューション:

  • は、私が使用するほとんどのライブラリは、すべてのモジュールで__version__を持っていない - だけでライブラリーの一番上のレベルで。
  • __version__を1か所に設定して、それ以外の場所を参照することができます。 from .versionno import __version__
  • Ignacioによると、すべてのファイルに書かなければならない場合は、sedなどを使い、簡単にしておきます。
+0

はい、私は自分自身で 'import'技術を使いたいと思います。バージョン番号変数を含むファイルを書き出して、必要な場所にインポートするのはとても簡単です。 – kindall

1

奇妙なことに、このためにsedを使用すると、ほぼというジョブの正しいツールであるため、ほぼPythonicと考えることができます。

0

私はトーマスとイグナシオの回答に同意します。特に、そのバージョン番号は1つの中心的な場所にある必要があります。 しかし、これはオプションではない(あるいは私の場合は - 怠惰になっている)モジュールでは、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') 
関連する問題