파이썬 진입 점을 설명 하시겠습니까?


181

필론과 피크 페이지의 계란 진입 점에 대한 문서를 읽었지만 여전히 이해하지 못합니다. 누군가 나에게 설명해 줄 수 있습니까?

답변:


168

"엔트리 포인트"는 일반적으로 파이썬 패키지 개발자 나 사용자가 사용하고자하는 함수 (또는 다른 호출 가능한 함수와 유사한 객체)입니다. 의견에서 지적했다!).

가장 널리 사용되는 진입 점은 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 패키지를 설치하여 엔트리 포인트 사용에 대한 훌륭한 예를 얻으 십시오. 파이썬 문서를 다른 형식으로 변환하는 데 유용한 6 가지 유용한 명령이 설치됩니다.


3
현재 docutils setup.py에는 전혀 포함되어 있지 않습니다 entry_points.
매트 윌키

2
이것은 "console_scripts"인 단일 entry_point 그룹 이름을 공유하는 여러 프로젝트의 힘을 보여 주므로 훌륭한 답변입니다. 이 답변을 Petri의 일반적인 답변과 비교하십시오. setuptools는이 pkg_resources 메커니즘을 사용하여 console_scripts를 가져 와서 그 주위에 쉘 랩퍼를 작성해야 함을 알 수 있습니다. 영감을주는? 이것들을 사용하십시오. 그들은 console_scripts 이상을 위해 좋습니다.
Bruno Bronosky

188

EntryPoints 는 지속적인 파일 시스템 기반 객체 이름 등록 및 이름 기반 직접 객체 가져 오기 메커니즘 ( setuptools 패키지로 구현 )을 제공합니다.

그들은 파이썬 객체의 이름을 자유 형식 식별자와 연결합니다. 따라서 동일한 Python 설치를 사용하고 식별자를 아는 다른 코드는 객체가 정의 된 위치에 관계없이 연관된 이름으로 객체에 액세스 할 수 있습니다. 관련된 이름은 파이썬 모듈에 존재하는 어떤 이름 일 수있다 ; 예를 들어 클래스, 함수 또는 변수의 이름입니다. 진입 점 메커니즘은 가져올 수있는 한 이름이 참조하는 것을 신경 쓰지 않습니다.

예를 들어, 함수 이름과 이름이 'myns.mypkg.mymodule'인 가상 파이썬 모듈을 사용합시다.

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 : 여기서 예시를 위해 사용 된 예에서, 진입 점의 이름은 실제로 아무 것도 사용되지 않으며 필요하지도 않습니다. 진입 점의 이름이 무엇이든 사용되는지 여부는 응용 프로그램에 달려 있습니다. 이름은 진입 점 인스턴스 의 이름 속성으로 간단히 사용할 수 있습니다 .
Petri

3
ep.name을 삭제하고 named_objects를 사전 대신 목록으로 만드는 것이 혼란스러워서 답변을 편집했다고 생각합니다. 이 답변은 이름을 얻는 위치와 이름이 'the_function'인지 또는 'my_ep_func'인지를 나타냅니다. 그렇지 않으면 독자는 다른 곳에서 추가 문서를 찾아야했습니다. 이것은 탁월한 답변이며 내가 본 entry_points에 대한 가장 짧고 명확한 설명입니다!
Bruno Bronosky

3
이 개념을 보여주는 github 프로젝트를 만들었습니다. github.com/RichardBronosky/entrypoint_demo
Bruno Bronosky 2014 년

1
자세한 설명은 진입 점에 대한 매우 명확한 설명입니다. EntryPoints설명은 매우 분명하다하지만 링크, 오래된이다.
Rahul Nair

18

추상적 인 관점에서 진입 점은 특정 인터페이스를 구현하는 시스템 전체의 Python 호출 가능 레지스트리를 만드는 데 사용됩니다. pkg_resources에는 특정 패키지에 의해 보급 된 진입 점을 확인하는 API와 특정 진입 점을 보급하는 패키지를 결정하는 API가 있습니다.

진입 점은 한 패키지가 다른 패키지에있는 플러그인을 사용하도록 허용하는 데 유용합니다. 예를 들어, Ian Bicking의 Paste 프로젝트는 진입 점을 광범위하게 사용합니다. 이 경우 진입 점을 사용하여 WSGI 애플리케이션 팩토리를 알리는 패키지를 작성할 수 있습니다 paste.app_factory.

진입 점에 대한 또 다른 용도는 일부 플러그인 기능을 제공하는 시스템의 모든 패키지를 열거하는 것입니다. TurboGears의 웹 프레임 워크는 사용하여 python.templating.engines설치 및 사용할 수있는 템플릿 라이브러리를 찾기 위해 진입 점을.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.