web-dev-qa-db-ja.com

Python 2.7でsetup.pyの代わりに「setup.cfg」を使用する方法

distutils.core.setup関数の名前付きキーワード引数の全体の代わりに、setup.cfgファイルと同じディレクトリにあるsetup.pyファイルとこれらすべてを使用できるように思えましたキーワードはsetup.cfgファイルから読み取られます。

Python 2.7でsetup.cfgを簡単に作成できると思っていましたが、最小限のテストバージョンでは機能しません。 UNKNOWNを返すsetup.py --nameでテストしました。

そして、いつものようにpython-packagingではドキュメントが地獄のように混乱します。それは、それらがどのバージョンに関連するか、少なくともドキュメントがどれくらい古いかは明らかではないからです。

私の2つのセットアップファイル:

setup.py:

from distutils.core import setup
setup()

setup.cfg:

[metadata]
name = foo
version = 0.1

Distutilsパッケージを調べたところ、(地獄のようにfuいだけでなく) mail.message_from_file ファクトリを使用してsetup.cfgを読み取ることがわかった。

私はsetup.pyのみのアプローチで大丈夫なので、そのようなナンセンスでそれほど長く悩むことはありませんが、それが可能であれば、それを正しく行う方法はまだ興味があります。

公式パッケージングドキュメントPackaging-Authority も、ここでは大きな助けにはならないようです。


ほとんどの場合、Pythonの2.x stdlibを調べることを余儀なくされていると感じるたびに、プログラミングしない方法を紹介しようとしているかどうか疑問に思っています。一方、Cコードは非常に美しいようです

25
Don Question

2016年12月およびsetuptoolsバージョン30.3.0の時点で、パッケージメタデータを アイドルサインの答え ごとにsetup.cfgに配置できることに注意してください。


問題は、setup.cfgファイルが希望どおりに動作しないことです。 setup関数にパラメーターを提供しません。 setup.pyが使用可能にするコマンドにパラメーターを提供するために使用されます。サポートされているコマンドは、setup.py --help-commandsで一覧表示できます。次のように表示されるはずです。

(env) gondolin/zender% ./setup.py --help-commands
Standard commands:
  build             build everything needed to install
  build_py          "build" pure Python modules (copy to build directory)
  .....
  install_data      install data files
  sdist             create a source distribution (tarball, Zip file, etc.)

これは、setup.cfgファイルに配置できるセクションのリストです。 setup.py --helpcommandを使用して、コマンドがサポートするオプションを一覧表示できます。たとえば、sdistコマンドは次のオプションをサポートします。

(env) gondolin/zender% ./setup.py --help sdist
Common commands: (see '--help-commands' for more)
....
Options for 'sdist' command:
  --formats         formats for source distribution (comma-separated list)
  --keep-temp (-k)  keep the distribution tree around after creating archive
                    file(s)
  --dist-dir (-d)   directory to put the source distribution archive(s) in
                    [default: dist]
  --help-formats    list available distribution formats

./ setup.py sdistをユーザーが実行したときに何が起こるかを制御するには、setup.cfg次のようなファイル。

[sdist]
keep-temp = 1
dist-dir = dist/source

したがって...setup.cfgは、プロジェクトのさまざまなセットアップコマンドの動作を単純に構成します。 setup関数には、キーワードパラメータとしてメタデータを指定する必要があります。 setup.cfgからメタデータをプルするdistutils.dist.Distributionクラスの独自のバージョンを記述し、distclass=キーワードパラメーターとしてsetup

パズルの欠けている部分は、標準のDistributionクラスがpathパラメータをdistutils.dist.DistributionMetadata初期化子に渡す方法を提供していないことです。あなたが言及したメール解析のものを使用してパッケージ情報。見つけたのは、 PEP-314 / PEP-345 メタデータファイルの処理に使用されるコードです。これは、setup関数では使用されません。代わりに、分散パッケージに埋め込まれたメタデータの解析に使用されます。

34
D.Shawley

setuptools 30.3. (2016年12月8日)setup.cfgの宣言的構成- 利用可能

ドキュメント

21
idle sign

免責事項python 2.7には、stdlib distutils package。他のバージョンでは誤解を招くか、偽である可能性があります

D. Shawleysとは独立して、非常に精巧で洗練された answer 私はかなり同じ結論に至り、宣言的メタデータに対して trivial solution を行うことにしました。

したがって、同じ質問にこだわっており、そのような些細さについてあまり時間をかけたくないすべての人のために、setup.cfg問題の短い要約を示します。

  • setup()setup.cfgを使用すると、一般的な方法で、提供されたすべてのコマンドの名前、バージョン、ライセンス、および同様のメタデータを宣言できません
  • これらのメタデータを定義するには、setup()のキーワード引数を使用する必要があります
  • setup.cfgのすべてのセクションはコマンドにちなんで命名され、setup()関数の動作を変更します D.Shawleysの回答を参照
  • 各コマンドごとに非常に冗長な方法でメタデータを定義できます
  • カスタムコマンドにはカスタムセクション名を自由に使用できます。この可能性を使用して、独自のソリューション iがしたように を実装できます。

これらの発見を念頭に置いて、次のようなsetup.cfg- sectionを許可する Q&D ™ソリューションを実装しました。

[metadata]
name = foo
version = 0.1

とsetup.py

distutils.core.setup(**metadata_from_setupcfg())

基本的には、distutils2-solutionをオリエンテーションとして採用し、execfileを使用することにより、setup.pyスクリプトに追加のパスハッスルを使用して、追加のインポートを行う必要がなくなりました。

exemplary Gist が利用可能な関心を持っています。

5
Don Question