2009-04-21 5 views

答えて

121

"エントリポイント"は、通常、呼び出し可能ではないオブジェクトを次のようなエントリポイントとして提供することができますが、Pythonパッケージの開発者またはユーザーが使用したい関数(または他の呼び出し可能な関数のようなオブジェクト)です。よく(コメントで正しく指摘されたように!)

最も一般的なエントリポイントは「console_script」エントリポイントです。このポイントは、パッケージをインストールするユーザーにコマンドラインツールとして提供される機能を指します。これは、のようなあなたのsetup.pyに入る:

entry_points={ 
    'console_scripts': [ 
     'cursive = cursive.tools.cmd:cursive_command', 
    ], 
}, 

私はちょうど「cursive.tools」と呼ばれる展開きたパッケージを持っている、と私はそれが誰かから実行できることを「筆記体」コマンド利用できるようにしたかったです以下のようなコマンドライン、:

def cursive_command(): 
    args = sys.argv[1:] 
    if len(args) < 1: 
     print "usage: ..." 

ので:

$ cursive --help 
usage: cursive ... 

はこれを行う方法は次のようになり筆記体/ツール/ cmd.pyで多分「cursive_command」機能のように、関数を定義しています前進;コマンドラインから呼び出され、ユーザーが提供している引数を解析していると仮定し、コマンドが何をするように設計されていてもそれを実行します。

入り口の使用の例としては、docutilsパッケージをインストールしてください。Pythonのドキュメントを他の形式に変換するための有用なコマンドをインストールします。

+3

現在のdocutilsの 'setup.py'には' entry_points'がまったく含まれていません。 –

+2

これは、 "console_scripts"という単一のentry_pointグループ名を共有する複数のプロジェクトの能力を実証する優れた答えです。この答えをペトリのより一般的な答えと比較してください。 setuptoolsがこのpkg_resourcesメカニズムを使用してconsole_scriptを取得し、それらの周りにシェルラッパーを作成する必要があることがわかります。インスピレーション?これらを使用してください。彼らは単にconsole_scripts以上のものに適しています。 –

16

抽象的な観点から、エントリポイントは、特定のインターフェイスを実装するPython呼び出し可能プログラムのシステム全体のレジストリを作成するために使用されます。 pkg_resourcesには、特定のエントリーポイントをアドバタイズするパッケージを決定するために、特定のパッケージによってアドバタイズされるエントリーポイントとAPIが含まれています。

エントリーポイントは、あるパッケージが別のパッケージに含まれているプラ​​グインを使用できるようにするのに便利です。たとえば、Ian BickingのPasteプロジェクトでは、エントリポイントが広く使用されています。この場合、エントリポイントpaste.app_factoryを使用してWSGIアプリケーションファクトリを宣言するパッケージを作成できます。

エントリポイントのもう1つの用途は、プラグインの機能を提供するシステム上のすべてのパッケージを列挙することです。 TurboGears Webフレームワークでは、python.templating.enginesエントリポイントを使用して、インストールされ使用可能なテンプレートライブラリをルックアップします。

152

EntryPointsは、永続的なファイルシステムベースのオブジェクト名登録と名前ベースの直接オブジェクトインポートメカニズム(setuptoolsパッケージによって実装されています)を提供します。

これらは、Pythonオブジェクトの名前を自由形式の識別子に関連付けます。したがって、同じPythonインストールを使用し、識別子を知っている他のコードは、オブジェクトがどこに定義されていても、関連付けられた名前のオブジェクトにアクセスできます。 の名前には、Pythonモジュールに存在する任意の名前を使用できます。クラス、関数、または変数の名前などです。エントリポイントのメカニズムは、インポート可能である限り、名前が何を参照しているかには関係ありません。

例として、関数の名前(の名前)と完全修飾名 'myns.mypkgを持つ虚偽のpythonモジュールを使用しましょう。mymodule ':

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のは、エントリポイント情報を読み出します特別なファイルに書かれています。エントリポイントを見つけ、モジュール(myns.mypkg.mymodule)をインポートし、pkg_resources.load()の呼び出し時にそこに定義されている関数を取得しました。

the_functionを呼び出すと、次に簡単になり、同一のグループIDには、他のエントリポイントの登録がなかったと仮定すると:最初に把握することが恐らく少し難しいつつ、エントリポイント機構が実際に

>>> named_objects['my_ep_func']() 
hello from the_function 

非常に使いやすい。プラグイン可能なPythonソフトウェア開発のための便利なツールを提供します。

+4

このプロセスで使用される 'my_ep_func'名はどこにありますか?これは、pkg_resourcesイテレータでは何も使用されていないようです。 –

+2

@KamilKisiel:ここでのイラストレーションの例では、エントリポイントの名前は実際には何のためにも使用されておらず、必要もありません。エントリポイントの名前が何かのために使用されているかどうかは、アプリケーションによって決まります。この名前は、単純にエントリポイントインスタンスの_name_属性として使用できます。 – Petri

+1

私はep.nameを破棄し、named_objectsに辞書の代わりにリストを作るのは混乱していると私は答えを編集したと思います。これは、名前を取得する場所と、それが 'the_function'または 'my_ep_func'になるかどうかを示す答えです。そうでなければ、読者は別の場所で別の文書を見つけなければなりませんでした。これは優れた答えで、私が見たentry_pointsの最短で明確な説明です! –

関連する問題