2013-04-10 3 views
1

주요 응용 프로그램에는 사용자가 사용할 수있는 몇 가지 추가 기능이 있습니다. 이러한 기능은 자체 디렉토리에 있습니다. 이러한 기능에는 추가 종속성이 필요할 수 있습니다. 그 파일을 requires.txt 파일에 저장하려고합니다. 런타임에 기능이 중단 될 경우 사람들에게 알려주고 싶습니다.python : 런타임시 추가 요구 사항을 확인하는 방법은 무엇입니까?

def checkfeature(feature): 
    everything_okay = True 
    f = pkg_resources.resource_stream(feature, "requires.txt") 
    with f: 
    for r in pkg_resources.parse_requirements(f): 
     if pkg_resources.working_set.find(r) is None: 
     print "%r not found, please install, otherwise this feature does not work" % (r,) 
     everything_okay = False 
    return everything_okay 

이 오른쪽 일을 파이썬 방법이 있나요 : 나는 현재이 같은 것을 고려하고? 이게 말이 돼?

작은 업데이트 : 너무 복잡하지 그냥 try: import ... except ImportError: ... 같은 하나의 대답에 제안 이유 :

  1. 우리의 플러그인 종속성의 무리가있을 수 있습니다. 아래 코드와 같은 실제 코드를 작성하는 것은 매우 장황합니다.
  2. 일부 플러그인에는 특정 버전의 패키지가 필요할 수 있습니다. 시험은 pakcage 특정 검사가 필요하거나 어쨌든 pkg_resources을 사용하십시오. 그래서 내 위의 아이디어는 pkg_resources를 사용합니다.
  3. 실행할 수있는 플러그인에 대한 단위 테스트를 실행하고 싶습니다. 단위 테스트에서 ImportError를 처리하는 것은 좋지 않습니다. can_we_unit_test_this_plugin(plugin) 기능을 사용하면 더 쉽게 작업 할 수 있습니다.

두 번째 업데이트 : setup.py에서 extra_require에 대해 무엇?

  1. 사람들은 자주 설치하지 않습니다. 좋아, 나쁜 변명.
  2. 내 생각에, setup.pyextra_require을 위에서 언급 한 requires.txt에서 곧바로로드합니다. 개별 기능의 개별 하위 디렉토리에 있습니다. 그러나 그것은 정말로 다음 단계입니다.

답변

4

일반적으로, 당신은 단지 수입 종속성을 시도하고 정상적으로 ImportError 예외를 처리 :

try: 
    import dependency 
except ImportError: 
    # dependency missing, issue a warning 
    import warnings 
    warnings.warn('dependency not found, please install to enable xyz feature') 

당신은 당신의 extras_require 항목에 이러한 종속성을 나열 할 수 있습니다 setup.py 스크립트를 setuptools에 기반. pip, easy_installzc.buildout은 모두 이러한 추가 기능 설치를 처리 할 수 ​​있습니다. Declaring “Extras” (optional features with their own dependencies)을 참조하십시오.

최소 요구 사항이있는 경우 extras_require 항목을 사용하여 최소 요구 사항을 나열 할 수 있습니다. 예, 사용자가 이미 이전 버전의 종속성이 설치되어있을 가능성이 있습니다. 나는 요구 사항을 명확하게 문서화했다. 실제로 의 기능은이며 버전이 아닙니다. 특정 API 메소드가 추가되었으므로 최신 버전이 필요합니까? 버전이 아닌 해당 메소드를 테스트하십시오.

그러나, 당신이 대신 별도의 패키지로 플러그인을 패키지로 할 수있는 것처럼 소리, 다음 extras_require에서 을 나열합니다. 이러한 플러그인을 등록하고 열거하려면 entry points을 사용합니다. 그렇게하면 이 아닌은 패키지에 대해 또는 수입을 테스트해야합니다. 등록 된 엔트리 포인트를 대신 열거하면됩니다. 각 플러그인은 자체 의존성을 나열하고 자체 단위 테스트를 가지고 있습니다.

+0

그래야, 특정 패키지의 특정 버전이 필요할 수도 있습니다. 그리고 기능이 작동하는지 미리 알고 싶습니다. 그것이 해당 기능에 대한 단위 테스트를 활성화하는 방법이기 때문입니다. 나는 나의 질문을 곧 개선 할 것이다. – Elrond

+0

나는 또한 나의 질문에'extra_require'에 대한 주석을 덧붙였다. 나는 그것을 이야기의 다른 부분으로 본다. 기능 점검 정보 : 예, 일반적으로 좋은 일이지만 때로는 매우 추악 할 수 있습니다. 특히, 특정 버전에서 복잡한 버그가 발생한 경우. 참고 : 위 체크 기능 만이 체크 할 수있는 유일한 방법은 아닙니다. 문제의 기능은 그 기능에 독자적으로 추가 할 수 있습니다. – Elrond

+0

@Elrond : expanded; 플러그인을 별도의 패키지로 분리하려고합니다. –