อธิบายจุดเข้า Python ได้ไหม


181

ฉันอ่านเอกสารเกี่ยวกับจุดเริ่มต้นไข่ใน Pylons และบนหน้า Peak และฉันก็ยังไม่เข้าใจจริงๆ มีใครช่วยอธิบายพวกเขาให้ฉันได้บ้าง

คำตอบ:


168

โดยทั่วไปแล้ว "จุดเข้าใช้งาน" คือฟังก์ชั่น (หรือวัตถุที่คล้ายฟังก์ชั่น callable อื่น ๆ ) ที่นักพัฒนาหรือผู้ใช้ของแพ็คเกจ Python ของคุณอาจต้องการใช้ถึงแม้ว่าวัตถุที่ไม่สามารถเรียกได้สามารถกำหนดให้เป็นจุดเข้าใช้งานได้เช่นกัน ชี้ให้เห็นในความคิดเห็น!)

ชนิดจุดเข้าที่นิยมมากที่สุดคือจุดเข้าconsole_scriptsซึ่งชี้ไปยังฟังก์ชันที่คุณต้องการให้พร้อมใช้งานเป็นเครื่องมือบรรทัดคำสั่งเพื่อใครก็ตามที่ติดตั้งแพ็คเกจของคุณ สิ่งนี้จะเข้าสู่ setup.py ของคุณเช่น:

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

ฉันมีแพคเกจที่ฉันเพิ่งปรับใช้เรียกว่า "cursive.tools" และฉันต้องการให้มีคำสั่ง "cursive" ที่ใครบางคนสามารถเรียกใช้จากบรรทัดคำสั่งเช่น:

$ 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 เป็นรูปแบบอื่น


3
docutils ปัจจุบันsetup.pyไม่ได้มีentry_pointsเลย
matt wilkie

2
นี่เป็นคำตอบที่ยอดเยี่ยมเพราะมันแสดงให้เห็นถึงพลังของหลายโครงการที่ใช้ชื่อกลุ่ม entry_point เดียวซึ่งก็คือ "console_scripts" เปรียบเทียบคำตอบนี้กับคำตอบทั่วไปโดย Petri คุณจะเห็นว่า setuptools ต้องใช้กลไก pkg_resources นี้เพื่อรับ console_scripts แล้วสร้าง shell wrapper รอบ ๆ สร้างแรงบันดาลใจ? ใช้สิ่งเหล่านี้ พวกเขาดีกว่า console_scripts
Bruno Bronosky

188

EntryPointsจัดเตรียมการลงทะเบียนชื่ออ็อบเจ็กต์แบบอิงระบบไฟล์และกลไกการนำเข้าอ็อบเจ็กต์โดยตรงตามชื่อ (ใช้งานโดยแพ็กเกจsetuptools )

พวกเขาเชื่อมโยงชื่อของวัตถุ Python กับตัวระบุรูปแบบอิสระ ดังนั้นรหัสอื่น ๆ ที่ใช้การติดตั้ง Python เดียวกันและรู้ว่าตัวระบุสามารถเข้าถึงวัตถุที่มีชื่อที่เกี่ยวข้องไม่ว่าวัตถุจะถูกกำหนดไว้ที่ใด ชื่อที่เกี่ยวข้องสามารถเป็นชื่อใด ๆ ที่มีอยู่ในโมดูลหลาม ; ตัวอย่างเช่นชื่อของคลาสฟังก์ชั่นหรือตัวแปร กลไก entry point ไม่สนใจสิ่งที่ชื่ออ้างถึงตราบใดที่สามารถอิมพอร์ตได้

ตัวอย่างเช่นลองใช้ (ชื่อ) ฟังก์ชั่นและโมดูลหลามจินตภาพที่มีชื่อครบถ้วน 'myns.mypkg.mymodule':

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

จุดเข้าใช้งานจะถูกลงทะเบียนผ่านการประกาศจุดเข้าใช้งานใน setup.py ในการลงทะเบียน the_function ภายใต้ entrypoint ชื่อ '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) สามารถใช้เพื่อค้นหาจุดเข้าใช้งานและเข้าถึงวัตถุด้วยชื่อที่เกี่ยวข้อง:

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) และดึงข้อมูล the_function ที่กำหนดไว้ที่นั่นเมื่อเรียกไปที่ pkg_resources.load ()

สมมติว่าไม่มีการลงทะเบียนจุดเข้าใช้งานอื่น ๆ สำหรับรหัสกลุ่มเดียวกันการเรียกใช้ฟังก์ชัน __ ฟังก์ชันจะง่าย:

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

ดังนั้นในขณะที่อาจจะเข้าใจได้ยากในตอนแรกกลไกจุดเข้าใช้งานนั้นค่อนข้างใช้งานง่าย เป็นเครื่องมือที่มีประโยชน์สำหรับการพัฒนาซอฟต์แวร์ Python


4
ชื่อ 'my_ep_func' อยู่ที่ไหนในกระบวนการนี้ทั้งหมด? ดูเหมือนจะไม่ถูกใช้เพื่อสิ่งใดโดยตัววนซ้ำ pkg_resources
Kamil Kisiel

2
@ KamilKisiel: ในตัวอย่างที่ใช้สำหรับการวาดภาพประกอบที่นี่ชื่อของจุดเข้าใช้งานนั้นไม่ได้ใช้เพื่ออะไรและไม่ต้องการมัน ไม่ว่าชื่อของจุดเข้าใช้งานจะขึ้นอยู่กับสิ่งใดก็ตาม ชื่อนี้มีอยู่ในชื่อแอตทริบิวต์ของจุดเข้าใช้งาน
Petri

3
ฉันคิดว่าการทิ้งชื่อ ep.name และทำให้ named_objects รายการแทนที่จะเป็นพจนานุกรมทำให้ฉันสับสนดังนั้นฉันจึงแก้ไขคำตอบ นี่คือคำตอบที่แสดงให้เห็นว่าจะได้รับชื่อที่ไหนและคาดหวังว่ามันจะเป็น 'the_function' หรือ 'my_ep_func' มิฉะนั้นผู้อ่านจะต้องค้นหาเอกสารเพิ่มเติมที่อื่น นี่คือคำตอบที่ยอดเยี่ยมและเป็นคำอธิบายสั้น ๆ ที่ชัดเจนที่สุดของ entry_points ที่ฉันเคยเห็น!
Bruno Bronosky

3
ฉันได้สร้างโครงการบน GitHub ที่แสดงให้เห็นถึงแนวคิดนี้ github.com/RichardBronosky/entrypoint_demo
Bruno Bronosky

1
นี่คือคำอธิบายที่ชัดเจนของจุดเข้าใช้งานซึ่งคุณจะได้รับคำอธิบายโดยละเอียด EntryPointsการเชื่อมโยงจะค้าง แต่คำอธิบายที่มีความชัดเจนมาก
ราหุลแนร์

18

จากมุมมองแบบนามธรรมจุดเข้าใช้เพื่อสร้างรีจิสตรีของระบบของ Pables callables ที่ใช้อินเตอร์เฟสบางตัว มี API ใน pkg_resources เพื่อดูว่าจุดเข้าใช้งานใดที่โฆษณาโดยแพ็คเกจที่กำหนดรวมถึง API เพื่อกำหนดแพ็คเกจที่โฆษณาจุดเข้าใช้งานบางจุด

จุดเริ่มต้นมีประโยชน์สำหรับการอนุญาตให้หนึ่งแพ็คเกจใช้ปลั๊กอินที่อยู่ในแพ็คเกจอื่น ตัวอย่างเช่นโครงการวางของ Ian Bicking ใช้จุดเข้าใช้อย่างกว้างขวาง ในกรณีนี้คุณสามารถเขียนแพคเกจที่ประกาศว่าโรงงานแอพลิเคชัน WSGI paste.app_factoryโดยใช้จุดเริ่มต้นที่

การใช้งานสำหรับจุดเข้าใช้งานก็คือการระบุแพ็คเกจทั้งหมดในระบบที่มีฟังก์ชั่นปลั๊กอิน TurboGearsกรอบเว็บใช้python.templating.enginesจุดเริ่มต้นที่จะมองขึ้นห้องสมุดแม่แบบที่มีการติดตั้งและสามารถใช้ได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.