2013-11-26 1 views
4

라이브러리를 가져 와서 예외를 catch하고 싶습니다.파이썬 라이브러리 가져 오기 및 사용할 수없는 경우 정상적으로 처리

블록 잡기 시도가 1 개 밖에없는 경우 첫 번째 예외가 발생합니다. 모든 libs를 반복하고 각 개별 lib에 대해 별도의 예외가있는 패턴이 있습니까?

#!/usr/bin/env python 

try: import sys 
except: print sys.exc_info() 
try: import numpy as np 
except: print sys.exc_info() 
try: import scipy as sp 
except: print sys.exc_info() 
try: import os as os 
except: print sys.exc_info() 
try: from operator import itemgetter 
except: print sys.exc_info() 
try: import socket 
except: print sys.exc_info() 
try: import logging 
except: print sys.exc_info() 
try: from time import gmtime, strftime 
except: print sys.exc_info() 
+9

귀하의 예외 처리기가 완전히 경우 실패 할

libnames = ['numpy', 'scipy', 'operator'] for libname in libnames: try: lib = __import__(libname) except: print sys.exc_info() else: globals()[libname] = lib 

: 예를 들어

'sys '를 가져 오지 못합니다. –

+6

표준 라이브러리는 여기에서 제외합니다. 왜 그것들을 가져 오는 것이 실패 *할까요? –

+4

이러한 가져 오기 중 하나라도 실패하면 코드가 작동해야하는 이유는 무엇입니까? 당신의 코드가'sp' 나'np'를 처리 할만큼 강력합니까? –

답변

5

__import__을 사용하면 모듈을 동적으로 가져올 수 있습니다. 모듈 이름을 반복하여 모듈을 가져올 수 있습니다. 당신은 import ... as ...from ... import ... 형태를 처리하기 위해 그것을 확장 할 수 있습니다 또는 단지 지정이 나중에 수동으로, 즉 :

np = numpy 
sp = scipy 
itemgetter = operator.itemgetter 
+0

나는이 솔루션을 더 좋아한다. 왜냐하면 여분의 라이브러리를 가져올 필요없이 기본적인 파이썬을 사용하기 때문이다. – Istvan

4

공통이지만, 다음과 같은 쉬운 디자인 패턴과 그 변화는 낙담 같습니다 libray를 사용할 수있는 경우

# BAD, hides circular import etc. nested errors 
    try: 
     import moolib 
    except ImportError: 
     raise ImportError("You must install moolib from http://moo.example.com in order to run this app") 

가 대신 확인 파이썬 패키지 관리자를 사용

# GOOD 
import pkg_resources 

try: 
    pkg_resources.get_distribution('plone.dexterity') 
except pkg_resources.DistributionNotFound: 
    HAS_DEXTERITY = False 
else: 
    HAS_DEXTERITY = True 

더 주제에 대한 자세한 내용은 여기를 참조하십시오.

  • 는 파이썬 표준 라이브러리 모듈 (다음 stdlib)는 항상 사용할 수 있습니다.

  • +0

    첫 번째 버전은 순환 가져 오기 오류를 숨길 수 있으므로 BAD라고 링크되어 있습니다. – Paolo

    +0

    감사. 명확히했다. –

    +0

    여기에 제시된 첫 번째 버전은 의도하지 않은 것을 숨길 수 있기 때문에 좋지 않지만, Asker에서 사용한 원래 버전은 아닙니다. 실제로 발생한 오류를 인쇄합니다. –

    관련 문제