Giải thích điểm nhập Python?


181

Tôi đã đọc tài liệu về các điểm vào trứng trong Pylons và trên các trang Đỉnh, và tôi vẫn không thực sự hiểu. Ai đó có thể giải thích chúng cho tôi?

Câu trả lời:


168

"Đ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ù cũng có thể cung cấp một đối tượng không thể gọi được như một điểm nhập cảnh (chính xác chỉ ra trong các ý kiến!).

Loại điểm nhập phổ biến nhất là điểm nhập console_scripts , trỏ đến một chức năng mà bạn muốn có sẵn dưới dạng công cụ dòng lệnh cho bất cứ 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 triển khai có tên là "cursive.tools" và tôi muốn nó có sẵn một lệnh "khó hiểu" mà 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 hàm, giống như có thể là hàm "cursive_command" trong cursive / tools / cmd.py trông giống như:

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

và kể từ đó trở đi; cầ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 cho một ví dụ tuyệt vời về việc sử dụng điểm nhập cảnh: nó sẽ cài đặt một cái gì đó giống như một nửa tá lệnh hữu ích để chuyển đổi tài liệu Python sang các định dạng khác.


3
các tài liệu hiện tại ' setup.pyhoàn toàn không chứa entry_points.
matt wilkie

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 chung hơn của Petri. Bạn sẽ thấy các công cụ thiết lập phải sử dụng cơ chế pkg_resource này để lấy console_scripts và sau đó tạo một trình bao bọc xung quanh chúng. Cảm hứng? Sử dụng chúng. Chúng tốt cho nhiều thứ hơn là chỉ console_scripts.
Bruno Bronosky 11/03/2015

188

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

Chúng liên kết tên của các đối tượng Python với các định danh dạng tự do. Vì vậy, bất kỳ mã nào khác sử dụng cùng cài đặt Python và biết mã định danh 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. Các tên liên quan 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 tên gọi là gì, miễn là có thể nhập được.

Ví dụ: hãy sử dụng (tên của) một hàm và mô-đun python tưởng tượng với 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 vào được đăng ký thông qua khai báo điểm vào trong setup.py. Để đăng ký the_factor dưới mục nhập được 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 vào được nhóm lại; có API tương ứng để tra cứu tất cả các điểm vào thuộc 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 cú pháp bởi setuptools. Sau đó nó ghi thông tin được phân tích cú pháp trong tập tin đặc biệt. Sau đó, API pkg_resource (một phần của setuptools) có thể được sử dụng để tra cứu điểm nhập cảnh và truy cập (các) đối tượng với (các) tên liên quan:

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 ghi trong các tệp đặc biệt. Nó đã tìm thấy điểm vào, nhập mô-đun (myns.mypkg.mymodule) và lấy ra hàm_định nghĩa được xác định ở đó, khi gọi tới pkg_resource.load ().

Giả sử không có đăng ký điểm vào nào khác cho cùng một id nhóm, việc gọi hàm_feft sẽ đơn giản:

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

Do đó, mặc dù có thể hơi khó nắm bắt lúc đầu, cơ chế điểm vào thực sự 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ả quá trình này ở đâu? Nó dường như không được sử dụng cho bất cứ điều gì bởi trình lặp pkg_resource.
Kamil Kisiel

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 cứ điều gì tùy thuộc vào ứng dụng. Tên có sẵn chỉ đơn giản là thuộc tính tên của thể hiện điểm vào.
Petri

3
Tôi nghĩ rằng việc loại bỏ ep.name và đặt tên_objects một danh sách thay vì từ điển là khó hiểu nên tôi đã chỉnh sửa câu trả lời. Đây là những gì câu trả lời cho thấy cả hai nơi để có được tên và liệu mong đợi nó là 'the_feft' hay 'my_ep_func'. Nếu không, người đọc phải tìm tài liệu bổ sung ở nơi khác. Đây là một câu trả lời TUYỆT VỜI và là lời giải thích ngắn gọn, rõ ràng nhất về entry_point mà tôi từng thấy!
Bruno Bronosky

3
Tôi đã tạo một dự án trên github thể hiện khái niệm này. github.com/RichardBronosky/entrypoint_demo
Bruno Bronosky

1
Đây là một lời giải thích rất rõ ràng về các điểm vào, mà bạn cho lời giải thích chi tiết. Các EntryPointsliên kết là cũ, mặc dù lời giải thích rất rõ ràng.
Rahul Nair

18

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

Điểm vào rất hữu ích để cho phép một gói sử dụng các plugin nằm trong gói khác. Chẳng hạn, dự án Paste của Ian Bicking sử dụng rộng rãi các điểm vào. 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 vào paste.app_factory.

Một cách sử dụng khác cho các điểm vào 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 plugin. Các TurboGears khuôn khổ web sử dụng các python.templating.enginesđiểm vào để tìm kiếm các thư viện khuôn mẫu đã được cài đặt và có sẵn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.