2009-04-21 73 views

回答

121

「入口點」通常是你的Python封裝的開發者或用戶可能希望使用,雖然非可調用對象可以作爲入口點作爲被提供的功能(或其它的可調用函數狀物體)好(正如在評論中正確指出的那樣)。

最流行的一種切入點是「console_script」的切入點,它指向你想提供一個命令行工具來安裝任何人你的包的功能。該進入你的setup.py,如:

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

我有一個包,我剛纔部署所謂的「cursive.tools」,我希望它是,提供一種「草書」命令的人可以從運行命令行,如:

$ cursive --help 
usage: cursive ... 

做的方式,這是定義一個函數,像草書/工具/ 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-05-19 07:28:30

+2

這是一個很好的答案,因爲它演示了共享單個entry_point組名的多個項目的強大功能,即「console_scripts」。比較這個答案和Petri更一般的答案。您將看到setuptools必須使用此pkg_resources機制來獲取console_scripts,然後在它們周圍創建一個shell包裝器。激勵?使用這些。它們不僅適用於console_scripts。 – 2015-03-11 21:37:31

16

但從抽象的點,切入點是用來創建實現某些接口的Python可調用的全系統的註冊表。 pkg_resources中有API用於查看給定包通告哪些入口點以及API以確定哪些包通告某個入口點。

入口點是允許一個包也使用在另一個包插件有用。例如,Ian Bicking的Paste項目廣泛使用入口點。在這種情況下,您可以使用入口點paste.app_factory編寫一個廣告程序包來宣傳其WSGI應用程序工廠。

另一個用途爲入口點枚舉提供一些插件功能的系統上的所有包。 TurboGears Web框架使用python.templating.engines入口點來查找已安裝且可用的模板庫。

152

EntryPoints提供基於文件系統的持久對象名稱註冊和基於名稱的直接對象導入機制(由setuptools包實現)。

他們將Python對象的名稱與自由格式標識符關聯起來。因此,任何使用相同Python安裝並知道標識符的其他代碼都可以訪問具有相關名稱的對象,而不管對象是在哪裏定義的。 關聯的名稱可以是Python模塊中存在的任何名稱;例如類,函數或變量的名稱。入口點機制不關心名稱所指的是什麼,只要它是可導入的即可。

作爲一個例子,讓我們用(的名稱)的功能,和一個虛蟒模塊與一個完全合格的名稱「myns.mypkg。mymodule':

def the_function(): 
    "function whose name is 'the_function', in 'mymodule' module" 
    print "hello from the_function" 

入口點通過setup.py中的入口點聲明進行註冊。要註冊the_function下入口點稱爲「my_ep_func」:

entry_points = { 
     'my_ep_group_id': [ 
      'my_ep_func = myns.mypkg.mymodule:the_function' 
     ] 
    }, 

如示例所示,入口點被分組;有相應的API來查找屬於一個組的所有入口點(下面的例子)。

在安裝包(即運行'python setup.py install')時,上述聲明由setuptools解析。然後它將解析的信息寫入特殊文件。在此之後,pkg_resources API(setuptools的部分)可用於查找入口點,並與相關的姓名(或名稱)訪問對象(S):

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()時檢索那裏定義的函數。

假設有同一組ID沒有其他入口點註冊,然後調用the_function將是簡單:

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

因此,雖然也許有點難以在第一把握,切入點機制實際上是使用非常簡單。它爲可插入Python軟件開發提供了一個有用的工具。