2013-07-22 8 views
12

pythonのドキュメント(http://www.python.org/dev/peps/pep-0396/)を読んだ後は、パッケージの__version__属性を適切に設定する方法について、これまでよりも混乱しました。それをsetup.pyファイルに入れると言われていますが、それは私を混乱させます。my_package.__version__として利用できないでしょうか?pythonパッケージの__version__属性を問題なく作成する

バージョン属性が別のファイルからインポートされました。

だから私の "バージョン" ファイルは通常

my_package/ 
    __init__.py 
    my_module1/ 
     ... 
    my_module2/ 
     ... 
    my_module3/ 
     ... 
    info/ 
     __init__.py 
     version.py 
      __version__ = '0.1.0' 

で、最上位の__init__.pyに私はinfo.versionから__version__属性 インポート:1が経由して、バージョン番号を取得することができるように

import __version__

my_package.__version__ 

私はこれが「大丈夫」なアプローチであるかどうか、何かがこのようにするのに対して何か言いたいのかどうか疑問に思っていますか?私はあなたの意見と提案を楽しみにしています!

+5

密接に関連してのようなものを取得するためにこれを使用することができます:[パッケージを共有するための正しい方法は何ですかバージョンはsetup.pyとパッケージで?](http://stackoverflow.com/q/17583443)、 'distutils'の代わりに' setuptools'を使う必要があります。いいえ、 'setup.py'でバージョンを設定しても、' my_package .__ version__'として利用できるようにはなりません。 –

+0

私は他のスレッドをチェックアウトします、ありがとう! – Sebastian

答えて

1

あなたはバージョン番号をsetup.pyにどのように取得するのかは述べていませんが、通常のimport my_packageの方法でバージョン番号をインポートしようとはしません。 setup.pyを実行すると、パッケージはインストールされていません!

私は、通常、バージョン番号をsetup.pyで定義し、バージョン番号が変更されたときにパッケージのトップレベルの__init__.pyファイルをsetup.py(再生成)する必要があります。 __init__.pyファイルに他のコードが含まれていないと、これは簡単です。

+1

はい、うまくいくはずです。今は、基本的に 'setup.py'に定義されたバージョン番号と' __init __。py'に定義されているバージョン番号を持っています - これは、あなたがパッケージを更新するときにどちらかを変更するのを忘れるまでうまくいきます: – Sebastian

4

解決策の1つは__init__.pyファイルに__version__を定義し、setup.pyの中からそれを読み取ることです。つまり、1つの場所でバージョンを変更するだけです。私はこれを行います小さな関数を書いた:

from setuptools import setup 
import re 

def get_property(prop, project): 
    result = re.search(r'{}\s*=\s*[\'"]([^\'"]*)[\'"]'.format(prop), open(project + '/__init__.py').read()) 
    return result.group(1) 

project_name = 'YOUR PROJECT' 
setup(
    ..., 
    version = get_property('__version__', project_name), 
    ..., 
) 

あなたも__author__または何か他__init__.pyファイルで定義されて

関連する問題