10

質問は、それを行う方法について正確な指示を得ようとする試みです。完全な解決策ではないように思われる以前の試みはほとんどありませんでした:

パッケージ内のファイルを移動するソリューション

zipとして読み取るソリューション

get_distribution によるメタ情報へのアクセス

当面のタスクは、プログラムが実行されている卵に関する情報を読み取ることです。私が理解しているように、いくつかの方法があります:

  1. 卵の場所をハードコーディングし、それをzipアーカイブとして扱います - ファイルが別の場所に移動された場合に編集して再コンパイルする必要があるため、機能しますが、十分な柔軟性はありません

  2. 使用ResourceManager().resource_filename(__name__, filename)- これは、卵の中にあるがパッケージの中にはないファイルにアクセスできないという事実で制限されているようです。ファイル名の「../../EGG-INFO/PKG-INFO」のような表記は、KeyError を与えて機能しません。だからもったいない。

  3. distオブジェクトを使用dist = pkg_resources.get_distribution("dist_name")してから情報を取得しますが、ドキュメントからはディストリビューション名を指定する方法を理解できませんか? 見つからない。

だから、私はpkg_resources.get_distributionプラスの使用に関する正しい解決策を探しています。卵の中から任意のファイルを読み取るための完全な解決策が最終的にあればいいのにと思います。

ありがとう!

4

2 に答える 2

8

Setuptools/distribute/pkg_resources は、標準の Python distutils に対する一種の透過的なオーバーレイになるように設計されていますが、これはかなり制限されており、コードを配布する適切な方法を許可していません。

卵は、Pythonファイル、データファイル、およびメタデータの束をまとめる方法にすぎず、Java JARに多少似ていますが、Pythonパッケージは、卵がなくてもソースからインストールできます(これは標準には存在しない概念です)分布)。

したがって、ここには 2 つのシナリオがあります。ライブラリ内のファイルを使用しようとしているプログラマーであり、そのような場合、ディストリビューションからファイルを読み取るために、そのフル パスは必要ありません。開いているファイル オブジェクトとそのコンテンツですよね?したがって、次のようにする必要があります。

from pkg_resources import resource_stream, Requirement
resource_stream(Requirement.parse("restez==0.3.2"), "restez/httpconn.py")

これにより、パッケージ配布から要求したファイルの開いた読み取り可能なファイルが返されます。圧縮された卵の場合は、自動的に抽出されます。

ディストリビューション名はパッケージとは異なる場合があるため (restez) 内にパッケージ名を指定する必要があることに注意してください (たとえば、ディストリビューション Twisted はツイスト パッケージ名を使用します)。要件の解析では、次の構文を使用します: http://setuptools.readthedocs.io/en/latest/pkg_resources.html#requirements-parsing

これで十分です。卵の中からファイルを取得する方法がわかれば、卵のパスを知る必要はありません。

本当に完全なパスが必要で、卵が圧縮されていないことが確実な場合は、resource_stream の代わりに resource_filename を使用してください。

それ以外の場合、「パッケージ化ツール」を作成していて、パッケージの内容にアクセスする必要がある場合は、それが卵であろうとなかろうと、 pkg_resources (pkg_resources source)と同じように、自分で手動で行う必要があります。そのユースケースがないため、「卵の内容を照会する」ための正確な API はありません。ライブラリだけを使用するプログラマーの場合は、私が提案したように pkg_resources を使用してください。パッケージング ツールを作成している場合は、手をどこに置くべきかを知っておく必要があります。それだけです。

于 2012-10-29T17:08:31.233 に答える
3

モジュールのzipimporterロードに使用される は__loader__、モジュールの属性を使用してアクセスできるため、卵内のファイルへのアクセスは次のように簡単です。

__loader__.get_data('path/within/the/egg')
于 2012-10-26T19:06:04.850 に答える