2009-04-21 30 views

Trả lời

121

Một "điểm vào" thường là một hàm (hoặc đối tượng giống như hàm có thể gọi khác) mà nhà phát triển hoặc người dùng gói Python của bạn có thể muốn sử dụng, mặc dù đối tượng không gọi được có thể được cung cấp dưới dạng điểm nhập tốt (như được chỉ ra một cách chính xác trong các ý kiến!).

Điểm nhập phổ biến nhất là điểm nhập "console_script", trỏ đến hàm mà bạn muốn cung cấp dưới dạng công cụ dòng lệnh cho bất kỳ ai cài đặt gói của bạn. Điều này đi vào setup.py của bạn như:

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

Tôi có một gói Tôi vừa mới triển khai dự gọi là "cursive.tools", và tôi muốn nó làm cho có sẵn một "chữ thảo" lệnh rằng ai đó có thể chạy từ dòng lệnh, như:

$ cursive --help 
usage: cursive ... 

cách để làm điều này là xác định một chức năng, như có thể là một chức năng "cursive_command" trong chữ thảo/tools/cmd.py trông giống như:

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

và do đó ra; nó nên giả định rằng nó được gọi từ dòng lệnh, phân tích các đối số mà người dùng đã cung cấp, và ... tốt, làm bất cứ điều gì lệnh được thiết kế để làm.

Cài đặt gói docutils để có ví dụ tuyệt vời về sử dụng điểm vào: nó sẽ cài đặt một vài lệnh hữu ích để chuyển đổi tài liệu Python sang các định dạng khác.

+3

các docutils hiện tại ''setup.py' không chứa' entry_points'. –

+2

Đây là một câu trả lời tuyệt vời vì nó thể hiện sức mạnh của nhiều dự án chia sẻ một tên nhóm entry_point duy nhất, đó là "console_scripts". So sánh câu trả lời này với câu trả lời chung hơn của Petri. Bạn sẽ thấy rằng các công cụ thiết lập phải đang sử dụng cơ chế pkg_resources này để có được bảng điều khiển và sau đó tạo một trình bao bọc shell xung quanh chúng. Cảm hứng? Sử dụng chúng. Họ là tốt cho nhiều hơn chỉ console_scripts. –

16

Từ quan điểm trừu tượng, các điểm nhập được sử dụng để tạo ra một đăng ký toàn hệ thống các cuộc gọi Python thực hiện các giao diện nhất định. Có các API trong pkg_resources để xem các điểm vào nào được quảng cáo bởi một gói nhất định cũng như các API để xác định gói nào quảng cáo một điểm vào nào đó.

Điểm vào hữu ích cho phép một gói sử dụng các plugin nằm trong gói khác. Ví dụ, dự án Paste của Ian Bicking sử dụng điểm vào rộng rãi. Trong trường hợp này, bạn có thể viết một gói quảng cáo nhà máy ứng dụng WSGI của nó bằng cách sử dụng điểm nhập paste.app_factory.

Sử dụng khác cho các điểm nhập là liệt kê tất cả các gói trên hệ thống cung cấp một số chức năng của plugin. Khung công tác web TurboGears sử dụng điểm nhập python.templating.engines để tra cứu các thư viện mẫu được cài đặt và khả dụng.

152

EntryPoints cung cấp đăng ký tên đối tượng dựa trên hệ thống tệp liên tục và cơ chế nhập đối tượng trực tiếp dựa trên tên (được thực hiện bởi gói setuptools).

Chúng liên kết tên của các đối tượng Python với số nhận dạng dạng tự do. Vì vậy, bất kỳ mã nào khác sử dụng cùng một cài đặt Python và biết số nhận dạng có thể truy cập một đối tượng có tên liên quan, bất kể đối tượng được xác định ở đâu. Tên liên kết có thể là bất kỳ tên nào tồn tại trong mô-đun Python; ví dụ tên của một lớp, hàm hoặc biến. Cơ chế điểm vào không quan tâm đến tên gọi đề cập đến, miễn là nó có thể nhập được.

Ví dụ, hãy sử dụng (tên) một hàm và mô-đun python tưởng tượng có tên đủ điều kiện 'myns.mypkg.mymodule ':

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

Điểm nhập được đăng ký qua khai báo điểm nhập trong setup.py. Để đăng ký the_function dưới entrypoint gọi là 'my_ep_func':

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

Như ví dụ cho thấy, các điểm nhập được nhóm lại; có API tương ứng để tra cứu tất cả các điểm vào thuộc về một nhóm (ví dụ bên dưới).

Khi cài đặt gói (ví dụ: chạy 'python setup.py install'), khai báo ở trên được phân tích bằng các công cụ thiết lập. Sau đó nó ghi thông tin được phân tích cú pháp trong tệp đặc biệt. Sau đó, pkg_resources API (một phần của setuptools) có thể được sử dụng để tìm kiếm các điểm nhập và truy cập các đối tượng (s) với tên liên quan (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()}) 

Ở đây, setuptools đọc thông tin điểm vào đó được viết trong các tập tin đặc biệt. Nó tìm thấy điểm vào, nhập khẩu mô-đun (myns.mypkg.mymodule), và lấy ra hàm the_function được định nghĩa ở đó, sau khi gọi tới pkg_resources.load().

Giả sử không có đăng ký nhập điểm khác cho id cùng một nhóm, gọi the_function sau đó sẽ là đơn giản:

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

Như vậy, trong khi có lẽ một chút khó khăn để nắm bắt lúc đầu, cơ chế điểm nhập cảnh thực sự là khá đơn giản để sử dụng. Nó cung cấp một công cụ hữu ích để phát triển phần mềm Python có thể cắm được.

+4

Tên 'my_ep_func' được sử dụng trong tất cả quy trình này ở đâu? Nó dường như không được sử dụng cho bất cứ điều gì bởi pkg_resources iterator. –

+2

@KamilKisiel: trong ví dụ được sử dụng để minh họa ở đây, tên của điểm vào thực sự không được sử dụng cho bất cứ điều gì, cũng không cần nó; có hay không tên của điểm vào được sử dụng cho bất kỳ thứ gì tùy thuộc vào ứng dụng. Tên có sẵn đơn giản là thuộc tính _name_ của cá thể điểm nhập. – Petri

+1

Tôi nghĩ rằng discarding ep.name và làm named_objects một danh sách thay vì một từ điển đã gây nhầm lẫn vì vậy tôi đã chỉnh sửa câu trả lời. Câu trả lời này cho thấy cả hai nơi lấy tên và cho dù đó là 'the_function' hoặc 'my_ep_func'. Nếu không, người đọc phải tìm thêm tài liệu ở nơi khác. Đây là câu trả lời tuyệt vời và là giải thích ngắn nhất, rõ ràng nhất về entry_points mà tôi từng thấy! –