Pylons と Peak のページにある卵のエントリ ポイントに関するドキュメントを読みましたが、まだよくわかりません。誰か説明してくれませんか?
3 に答える
「エントリ ポイント」は通常、Python パッケージの開発者またはユーザーが使用したい関数 (または他の呼び出し可能な関数のようなオブジェクト) ですが、呼び出し不可能なオブジェクトをエントリ ポイントとして提供することもできます (正しくはコメントで指摘されました!)。
最も一般的な種類のエントリ ポイントはconsole_scripts
エントリ ポイントです。これは、パッケージをインストールするすべてのユーザーがコマンド ライン ツールとして使用できるようにする関数を指します。これは次のsetup.py
ようにスクリプトに入ります。
entry_points={
'console_scripts': [
'cursive = cursive.tools.cmd:cursive_command',
],
},
という名前のデプロイしたばかりのパッケージがcursive.tools
あり、コマンドラインから誰かが実行できる「筆記体」コマンドを利用できるようにしたかったのです。
$ cursive --help
usage: cursive ...
これを行う方法は、次のようなcursive_command
ファイル内の関数のように、関数を定義することです。cursive/tools/cmd.py
def cursive_command():
args = sys.argv[1:]
if len(args) < 1:
print "usage: ..."
など。コマンドラインから呼び出されたと想定し、ユーザーが提供した引数を解析し、コマンドが設計されていることを何でも実行する必要があります。
エントリポイントの使用例としてパッケージをインストールしdocutils
ます。これにより、Python ドキュメントを他の形式に変換するための便利なコマンドが 6 つほどインストールされます。
EntryPointsは、永続的なファイル システム ベースのオブジェクト名登録および名前ベースの直接オブジェクト インポート メカニズム ( setuptoolsパッケージによって実装されます) を提供します。
Python オブジェクトの名前を自由形式の識別子に関連付けます。したがって、同じ Python インストールを使用し、識別子を知っている他のコードは、オブジェクトがどこで定義されていても、関連付けられた名前でオブジェクトにアクセスできます。関連する名前は、Python モジュールに存在する任意の名前にすることができます。たとえば、クラス、関数、または変数の名前。エントリ ポイント メカニズムは、名前がインポート可能である限り、名前が何を参照しているかは気にしません。
例として、関数 (の名前) と、完全修飾名 'myns.mypkg.mymodule' を持つ架空の Python モジュールを使用してみましょう。
def the_function():
"function whose name is 'the_function', in 'mymodule' module"
print "hello from the_function"
エントリ ポイントは、setup.py のエントリ ポイント宣言によって登録されます。「my_ep_func」というエントリポイントの下に the_function を登録するには:
entry_points = {
'my_ep_group_id': [
'my_ep_func = myns.mypkg.mymodule:the_function'
]
},
例が示すように、エントリ ポイントはグループ化されています。グループに属するすべてのエントリ ポイントを検索する対応する API があります (以下の例)。
パッケージのインストール時 (つまり、'python setup.py install' の実行時)、上記の宣言は setuptools によって解析されます。次に、解析された情報を特別なファイルに書き込みます。その後、pkg_resources API (setuptools の一部) を使用してエントリ ポイントを検索し、関連付けられた名前でオブジェクトにアクセスできます。
import pkg_resources
named_objects = {}
for ep in pkg_resources.iter_entry_points(group='my_ep_group_id'):
named_objects.update({ep.name: ep.load()})
ここで、setuptools は、スペシャル ファイルに書き込まれたエントリ ポイント情報を読み取ります。pkg_resources.load() の呼び出し時に、エントリ ポイントを見つけ、モジュール (myns.mypkg.mymodule) をインポートし、そこに定義されている the_function を取得します。
the_function の呼び出しは簡単です。
>>> named_objects['my_ep_func']()
hello from the_function
このように、最初は理解するのが少し難しいかもしれませんが、エントリー ポイントのメカニズムは実際には非常に簡単に使用できます。これは、プラグイン可能な Python ソフトウェア開発のための便利なツールを提供します。
抽象的な観点から、エントリ ポイントは、特定のインターフェイスを実装する Python 呼び出し可能オブジェクトのシステム全体のレジストリを作成するために使用されます。pkg_resources には、特定のパッケージによってどのエントリ ポイントがアドバタイズされているかを確認するための API と、特定のエントリ ポイントをアドバタイズするパッケージを特定するための API があります。
エントリ ポイントは、あるパッケージが別のパッケージにあるプラグインを使用できるようにする場合に便利です。たとえば、Ian Bicking のPasteプロジェクトでは、エントリ ポイントを広範囲に使用しています。この場合、エントリ ポイントを使用して WSGI アプリケーション ファクトリをアドバタイズするパッケージを作成できますpaste.app_factory
。
エントリ ポイントのもう 1 つの用途は、プラグイン機能を提供するシステム上のすべてのパッケージを列挙することです。TurboGears Web フレームワークは、python.templating.engines
エントリ ポイントを使用して、インストール済みで使用可能なテンプレート ライブラリを検索します 。