5

別の python パッケージのサブモジュールに拡張機能としてインストールするパッケージを作成したいと考えています。

基本的に、元のモジュールは次のように設定されています。

origmodule/
    __init__.py
    stuff.py
    ext/
        __init__.py
        # This module is empty

そして、拡張モジュールを空の origmodule.ext モジュールにインストールします。説明書を読んでもdistutils、これが可能かどうか、またはサポートされているかどうかは明確ではありませんでした。最終的な目標は、インストールされた拡張モジュールが次のようにインポートされるようにすることです。

import origmodule.ext.my_extension

4

1 に答える 1

5

別のパッケージ内へのインストールはサポートされていません。

代わりに、代わりにエントリ ポイントを使用します。origmodule特定のキーのエントリ ポイントとして登録されているものを探す必要があり、モジュールextensionはそのキーに自身を登録する必要があります。

拡張機能が拡張ポイントを登録します。

entry_points={
    'some.opaque.string.unique.to.origmodule':
        ['my_extension = my.extension.package:some.entry.point', ]
}

origmodule次に、次のように尋ねることで発見できますpkg_resources

import pkg_resources

for entrypoint in pkg_resources.iter_entry_points(group='some.opaque.string.unique.to.origmodule'):
    extension = entrypoint.load()

例として、 Babel プロジェクトを見てみましょう。Babel はファイルから翻訳可能なテキストを抽出できます。Python ソース コードに対してこれを行う方法を知っていますが、そのようなテキストを他の形式から抽出できる拡張機能もサポートしています。

このような抽出方法を拡張ポイントとして登録できます。Babel は、抽出メソッドの記述セクションでこれを文書化しています。次に、メッセージ抽出コードは、テキストを抽出するときにこれらのエントリ ポイントを読み込みます。

GROUP_NAME = 'babel.extractors'

# ...

for entry_point in working_set.iter_entry_points(GROUP_NAME,
                                                 method):
    func = entry_point.load(require=True)
    break

Mako テンプレート言語はそのようなプラグインを提供します。実際の実装を指すエントリ ポイントを登録します。

[babel.extractors]
mako = mako.ext.babelplugin:extract
def extract(fileobj, keywords, comment_tags, options):
    # ...
于 2013-04-15T17:01:01.283 に答える