2017-01-19 4 views
3

私はメタはPythonプロジェクトにメタ情報(__version__など)を入れる場所は?

__author__ = 'John Doe' 
__author_email__ = '[email protected]' 
__version__ = '1.2.3' 
# [...] 

を持っている私がしたいと思い、

superproject/ 
    -> __init__.py 
    -> meta.py 
setup.py 

ディレクトリ構造を持つ小さなPython2/3プロジェクトは__init__.pyファイルがimport Sの束と実際のコードが含まれていsetup.py(単純:ただimport superproject.meta)とsuperprojectとして入手可能なメタ情報は、

import superproject 
print(superproject.__version__) 

私は後者の要件に苦しんでいます。 __init__.py

from .meta import * 

をやったとき、私は例えば

print(superproject.meta.__version__) 

を行うことができます。私はsetup.pyimport superprojectする必要があると思いますので、私は直接__init__.pyにメタ情報を置くことができない、

注意、およびsuperprojectの多数のimport依存関係は、まだ利用できません。

ヒント

+1

この難解な問題に対するその他のオプション:https://packaging.python.org/single_source_version/ – jwodder

+0

@jwodder私が探していたもの。これを回答に昇格させると、私はそれを解決策にしてうれしいです。 –

+0

も参照してください[バンプ変換](https://pypi.python.org/pypi/bumpversion) – user25064

答えて

1

これは既知の問題であり、Pythonソフトウェア財団は、それについての記事全体を持っているのように

Single-sourcing the Project Version

私はすべての提案をして周りを回り、最終的には次の解決策を決定しました。

  1. __init__.py__about__.pyからmeta.pyfrom ... import ...それの名前を変更します。
  2. setup.py,exec__about__.pyを辞書に入れ、その情報を使用します。

これは、superproject.__about__.__version__およびsuperproject.__version__のようなすべてのメタ情報を提供します。また、これによりsuperprojectimportメタ情報が他のサブモジュールから容易に得られます。

setup.pyに少し複雑さが追加されますが、実際のプロジェクトコードはほとんど変更されません。遠隔保守が可能であれば、複雑なsetup.pyがどんなに複雑になっても気にしません。

0

あなたは、プロジェクトのルートにあるファイルからこれを読むことができます

import importlib 

meta = importlib.import_module ("mod.meta") 
print (meta.__author__) 
+1

もう少し詳しいことができますか?私はこれがどのように役立っているのか分かりません。 –

+0

私はあなたがsetup.pyに興味があると思ったので、このスニペットはそこに属しています。他のプロジェクトからメタデータにアクセスする必要がありますか? –

+0

それは素晴らしいですが、厳しい要件ではありません。 –

0

を行うことができます。このファイルをdata_filesに含めてsetup.pydocsに含めます。 JSONはおそらく最も簡単なフォーマットです。

superproject/ 
    -> __init__.py 
setup.py 
meta.json 
+0

インストールで 'superproject .__ version__'という情報を利用できるようにするには? –

+0

jsonファイルを読み込んで変数を設定し、同じことをsetup.pyファイルで行います – user25064

関連する問題