6

プログラムをプラグ可能にしたい。卵を使用して、 setuptools の方法を使用したいと思います。

一部の機能に代替クラスを提供するプラグインを作成でき、それを使用できます。

実行時に使用するクラスを選択したいと思います。私のコアモジュールまたはプラグインのいずれかです。これらのクラスを照会する pkg_resources の方法を使用したいと思います。

for entrypoint in pkg_resources.iter_entry_points("myapp.myclasses"):

私のクラスの EntryPoint オブジェクトをコアで作成し、それを登録して、 iter_entry_points が私の .egg プラグイン クラスと同じ方法でそれを返すようにするにはどうすればよいですか?

4

1 に答える 1

11

pkg_resources.iter_entry_points独自のパッケージを含む、任意のegg内の指定された名前のエントリポイントを一覧表示します。したがって、のentry_pointsエントリにsetup.py次のリストがありメタデータを生成するために実行setup.py developした場合、独自のエントリポイントが含まれます。

[myapp.myclasses]
classentry1 = myapp.mymodule:myclassname1
classentry2 = myapp.mymodule:myclassname2

Babelプロジェクトはまさにこれを行います。その中には、とのsetup.py両方のエントリポイントがリストされてbabel.checkersおりbabel.extractors、これらはそれぞれbabel.messages.checkers:_find_checkersとによって検索されbabel.messages.extract:extractます。

ファイル(テンプレートから作成および/または生成するのに十分簡単)が必要ない場合は、代わりに次setup.pyの内部状態を変更する必要があります。pkg_resources.working_set

  • working_set.entries卵のリストです。プロジェクトの最上位ディレクトリのパスをこれに追加する必要があります。
  • working_set.entry_keysパスからentriesパッケージ名のリストへのマッピングです。プロジェクトを`working_set.entry_keys[path]=['package.name']として追加します
  • working_set.by_keyパッケージ名からpkg_resources.Distributionインスタンスへのマッピングです。Distributionインスタンスを作成し、パッケージ名で保存する必要があります: working_set.by_key['package.name'] = yourdistribution

あなたの目的のために、Distributionインスタンスはかなりまばらにすることができますが、少なくともプロジェクト名を含めます。ただし、エントリポイントマップが必要です。

yourdistribution = Distribution(project_name='package.name')
yourdistribution._ep_map = {'myapp.myclasses', {
    'classentry1': entrypointinstance_for_classentry1,
    'classentry2': entrypointinstance_for_classentry2,
}}

内部構造_ep_mapは通常、egg-infoメタデータからオンデマンドで解析されます。

これは、バージョン間で変更される可能性のある、文書化されていない内部データ構造に完全に依存していることに注意してください。言い換えれば、あなたはここであなた自身です。代わりにファイルを生成しsetup.py、実行python setup.py developして代わりにeggメタデータを生成します。

于 2012-11-24T20:47:09.830 に答える