2009-04-20 4 views
7

모듈의 이름이 주어지면 어떻게 모듈 세트가 설치되었는지 여부를 테스트 할 수 있습니다. 예 :설치된 Python 모듈 종속성 테스트

modules = set(["sys", "os", "jinja"]) 

for module in modules: 
    # if test(module exists): 
    # do something 

이 같은 테스트를 쓰고 자 할 때 :

try: 
    import sys 
except ImportError: 
    print "No sys!" 

이 내가 뭘하는지에 대한 조금 복잡합니다. 이것을하기위한 역동적 인 방법이 있습니까?

eval ("import % s"% module)을 시도했지만 컴파일 오류가 발생했습니다.

귀하의 생각과 제안에 감사드립니다. 고맙습니다.

답변

8

당신은이 같은 __import__() 기능없이

for module in modules: 
    try: 
     __import__(module) 
    except ImportError: 
     do_something() 

또한 모듈이 을 발견 할 수 있는지 여부를 결정하기 위해 imp.find_module를 사용하여 그것을 가져 ::

import imp 
for module in modules: 
    try: 
     imp.find_module(module) 
    except ImportError: 
     do_something() 

오 :: 사용할 수 있습니다 eval()을 사용할 수없는 이유는 import이 표현식이 아니기 때문입니다. 당신 사용 exec 당신이 정말, 나는 그것을 :: 권하고 싶지 않다 할지라도 원하는 경우

for module in modules: 
    try: 
     exec 'import ' + module 
    except ImportError: 
     do_something() 
6

무엇이 문제입니까?

modules = set(["sys", "os", "jinja"]) 
for m in modules: 
    try: 
     __import__(m) 
    except ImportError: 
     # do something 

위의 코드는 __import__ 기능을 사용합니다. 또한 실제로 존재하는지 여부를 엄격하게 테스트합니다. 즉, 가져 오기를 실제로 저장하지 않아도되지만 쉽게 수정할 수 있습니다.

2
modules = set(["sys", "os", "jinja"]) 
try: 
    for module in modules: 
    __import__(module) 
    doSomething() 
except ImportError, e: 
    print e 
5

그것은 find_module 접근 방식과 __import__ 접근 방식 사이의 트레이드 오프를 이해하는 가치 :

  • __import__('foo')은 가져온 모듈에 대한 참조 저장 여부에 관계없이 모듈로드의 부작용을 유발합니다. 그건 괜찮을 수도 있고 아닐 수도 있습니다.
  • find_module('foo')은 부작용을 일으키지 않으므로 항상 안전해야합니다.
  • 도 접근 방식은 단순히 줄 것이다 제외/시도에 __import__('foo') 포장, 실패를 처리하는 방법에 따라 모듈이 발견되는 경우에 잘 작동하지만 부하 시간 (예. 구문 에러, 나가서 설명하자면 NameError, ...)
  • 에서 다른 문제가 foo가 발견되었지만 foo가 가져 오는 막대가 이 아닌 경우 잘못된 결과가 나타납니다.이 없습니다.
  • find_module()는 점으로 구분 된 이름을 처리 할 수 ​​없습니다, 그래서 당신은 'foo.bar.bat.baz'이 가져올 수 있는지 여부를 확인해야하는 경우, 당신은 docs.
을 따라 find_module 여러 호출을 사용해야하고 load_module