2013-04-15 5 views
4

다른 파이썬 패키지의 서브 모듈에 확장으로 설치하는 패키지를 만들고 싶습니다.Python 설치, 한 모듈을 다른 모듈의 하위 모듈로 설치 하시겠습니까?

origmodule/ 
    __init__.py 
    stuff.py 
    ext/ 
     __init__.py 
     # This module is empty 

을 그리고 내 확장 모듈은 빈 origmodule.ext 모듈에 설치 한 :

기본적으로 원래의 모듈과 같이 설정됩니다. distutils에 대한 지침을 읽는 것이 가능하거나 지원되는지 확실하지 않았습니다. 한 번 설치 내 확장 모듈은 다음과 같이 가져올 것이다 그래야 최종 목표는 다음과 같습니다

import origmodule.ext.my_extension

답변

5

당신은 setuptools에로, 다른 패키지 내부에 설치하는 이 지원되지 않습니다 것을 할 수 없습니다.

대신 entry points을 사용하고 싶습니다. origmodule은 특정 키의 진입 점으로 등록 된 것을 찾아야하며 extension 모듈은 해당 키에 대해 자체 등록해야합니다.

귀하의 확장은 확장 점을 등록합니다

entry_points={ 
    'some.opaque.string.unique.to.origmodule': 
     ['my_extension = my.extension.package:some.entry.point', ] 
} 

하는 당신의 origmodule 다음 pkg_resources을 요청하여 발견 할 수 있습니다 :

import pkg_resources 

for entrypoint in pkg_resources.iter_entry_points(group='some.opaque.string.unique.to.origmodule'): 
    extension = entrypoint.load() 

가 예로 Babel project를 살펴 보자. Babel은 파일에서 번역 가능한 텍스트를 추출 할 수 있습니다. Python 소스 코드에서이 작업을 수행하는 방법을 알고 있지만 다른 형식에서 이러한 텍스트를 추출 할 수있는 확장을 지원합니다.

이러한 추출 방법은 확장 점으로 등록 할 수 있습니다. Babel은 이것을 Writing Extraction Methods 섹션에서 설명합니다. 해당 메시지 코드 추출 loads those entry points 때 추출 된 텍스트 :

GROUP_NAME = 'babel.extractors' 

# ... 

for entry_point in working_set.iter_entry_points(GROUP_NAME, 
               method): 
    func = entry_point.load(require=True) 
    break 

Mako templating language 용품 등 플러그; actual implementation를 가리키는 것이 registers the entry point :`some.opaque.string.unique.to.origmodule`는 내가 분명하지 않다

[babel.extractors] 
mako = mako.ext.babelplugin:extract 
def extract(fileobj, keywords, comment_tags, options): 
    # ... 
+0

입니까? 확장 기능을 말하도록 선택한 이름입니까, 제 3 자 또는 다른 모듈이 그 이름으로 등록 할 수 있습니까? 둘째, 그렇다면이 이름이 내 응용 프로그램에 고유해야합니다. 예를 들어 다른 패키지가 같은 이름을 사용하는 경우 다른 패키지에서 내 확장 프로그램을 가져오고 가져 오겠습니까? –

+0

예, 선택하는 이름 일뿐입니다. 불투명 한 문자열을 의미합니다. :-) 다른 패키지가 같은 이름을 사용하면 자연스럽게 동일한 엔트리 포인트를로드합니다. –

+0

좋습니다. 감사합니다. 고마워요! –

관련 문제