Pythonのエントリポイントについて説明しますか?


181

Pylonsの卵のエントリポイントとPeakのページのドキュメントを読みましたが、それでもまだよくわかりません。誰かが私にそれらを説明できますか?

回答:


168

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

最も一般的な種類のエントリポイントは、console_scriptsエントリポイントです。これは、パッケージをインストールするすべての人がコマンドラインツールとして利用できるようにする関数を指します。これは次のようにsetup.pyに入ります:

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

展開したばかりの「cursive.tools」というパッケージがあります。次のように、コマンドラインから実行できる「cursive」コマンドを利用できるようにしたいと考えています。

$ cursive --help
usage: cursive ...

これを行う方法は、次のようなcursive / tools / cmd.pyの「cursive_command」関数のような関数を定義することです。

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

など; コマンドラインから呼び出されたものと想定し、ユーザーが提供した引数を解析します。そして、コマンドが実行するように設計されていることをすべて実行します。

エントリポイントの使用例としてdocutilsパッケージをインストールしてください。Pythonドキュメントを他の形式に変換するための便利なコマンドがいくつかインストールされます。


3
現在のdocutilsにsetup.pyは何も含まentry_pointsれていません。
マットウィルキー2013年

2
「console_scripts」という単一のentry_pointグループ名を共有する複数のプロジェクトの力を示しているため、これは優れた答えです。この答えをペトリによるより一般的な答えと比較してください。setuptoolsがこのpkg_resourcesメカニズムを使用してconsole_scriptsを取得し、それらの周りにシェルラッパーを作成する必要があることがわかります。刺激的ですか?これらを使用してください。それらは、console_scriptsだけではありません。
Bruno Bronosky、2015年

188

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が取得されました。

同じグループIDの他のエントリポイント登録がないと仮定すると、the_functionの呼び出しは簡単です。

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

したがって、最初は少し理解しにくいかもしれませんが、エントリポイントメカニズムは実際には非常に簡単に使用できます。プラグイン可能なPythonソフトウェア開発に役立つツールを提供します。


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

2
@KamilKisiel:この例で使用されている例では、エントリポイントの名前は実際には何も使用されていません。エントリポイントの名前が何かに使用されるかどうかは、アプリケーション次第です。名前は、エントリポイントインスタンスの名前属性として簡単に使用できます。
ペトリ

3
ep.nameを破棄して、named_objectsを辞書ではなくリストにすることは混乱を招いたと思うので、答えを編集しました。この答えは、名前を取得する場所と、それが「the_function」または「my_ep_func」であると予期するかどうかの両方を示しています。それ以外の場合、読者は他の場所で追加のドキュメントを見つける必要がありました。これは非常に優れた回答であり、これまでに見たentry_pointsの最も短く明確な説明です!
Bruno Bronosky、2015年

3
この概念を実証するプロジェクトをgithubに作成しました。github.com/RichardBronosky/entrypoint_demo
Bruno Bronosky

1
これはエントリポイントの非常に明確な説明です。詳細な説明が必要です。EntryPoints説明は非常に明確ですが、リンクは、古いです。
Rahul Nair

18

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

エントリポイントは、あるパッケージが別のパッケージにあるプラグインを使用できるようにする場合に役立ちます。たとえば、Ian BickingのPasteプロジェクトはエントリポイントを広範囲に使用しています。この場合、エントリポイントを使用して、WSGIアプリケーションファクトリをアドバタイズするパッケージを作成できますpaste.app_factory

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.