2012-06-28 2 views
5

현재 내 패키지 중 하나는 JSON 구문 분석기/엔코더가 필요하며 가능한 경우 simplejson (표준 라이브러리의 json 모듈로 다시 폴링)을 사용하도록 설계되었습니다 (벤치 마크에서 simplejson이 빠름을 나타냄).setuptools에서 선택적 패키지를 정의 할 수 있습니까?

그러나 최근에 simplejsonzc.buildout을 사용할 때 설치 될지 여부에 관해서는 &을 놓쳤습니다. github로 옮긴 것 같습니다. 어느 것이 나를 궁금해하게했다. 내 setup.py 파일에 옵션 패키지를 정의 할 수 있습니까? 사용할 수없는 경우 패키지 설치가 중단되지 않습니까?

답변

0

AFAIK 옵션 패키지를 정의 할 방법이 없으므로 사용하지 않아도됩니다. 옵션 패키지를 정의 할 때 무엇을 기대합니까? 그것은 아직 사용할 수 없을 때 설치됩니까? (어떻게 든 그것을 의무적으로 만들 것입니다)

아니요,이 정확한 해결 방법은 패키지를 사용하려는 수입에 있습니다. 예컨대 : 물론

try: 
    from somespecialpackage import someapi as myapi 
except ImportError: 
    from basepackage import theapi as myapi 

이 두 API를 호환해야하지만이 simplejson의 경우 표준 라이브러리 json 패키지

.

+2

선택 사항을 의미한다고는 패키지에 실패 할 경우 설치하면 설치가 방해받지 않고 완료 될 수 있습니다. –

+0

그래,하지만 패키지에 * 의존하지 않으면 왜 * 필수 패키지 *에 넣을 까? 나는 단순히 요점을 얻지 못한다. – Constantinius

+0

나는 그것을'required'리스트에 넣고 싶지 않습니다; 그게 내가 물어 보는거야 - 거기에 또 다른 옵션이 있습니까? 그렇다면 사용할 수 있으면 포함시킬 수 있습니까? –

6

설치시 선택적 패키지.

setup.py 스크립트에 대해 이야기하고 있다고 가정합니다. 당신이 그것을 바꿀 수 :

# mypackage/setup.py 

extras = { 
    'with_simplejson': ['simplejson>=3.5.3'] 
} 

setup(
    ... 
    extras_require=extras, 
    ...) 

는 다음 중 하나를 수행 할 수

  • pip install mypackage,
  • pip install mypackage[with_simplejson]

을, 후자는 simplejson>=3.5.3를 설치하기로.

모든 것을 설치하고 알려진 양호한 버전 인 fallback 대신 을 사용하면 작동하는 패키지의 하위 집합을 설치하는 것이 좋습니다.

실행시 선택적 패키지.

두 가지 패키지 세트를 설치 한 후에는 을 사용해야 사용할 수 있는지 확인하십시오. 예 : 당신의 json 수입 :

try: 
    # helpful comment saying this should be faster. 
    import simplejson as json 
except ImportError: 
    import json 

또 다른 더 복잡한 예 : 당신은 또한 일부 패키지에서이 패턴을 찾을 수 있습니다

try: 
    # xml is dangerous 
    from defusedxml.cElementTree import parse 
except ImportError: 
    try: 
     # cElementTree is not available in older python 
     from xml.cElementTree import parse 
    except ImportError: 
     from xml.ElementTree import parse 

그러나이 : ​​

는 는
try: 
    optional_package = None 
    import optional.package as optional_package 
except ImportError: 
    pass 

... 

if optional_package: 
    # do addtional behavior