2010-06-28 221 views
21

這可能有一個明顯的答案,但我是一個初學者。我有一個「模塊」(實際上只是一個包含一些我經常使用的函數的文件),其中我導入了其他一些模塊。但是,由於我在很多系統上工作,並非所有模塊都可以在任何特定機器上加載。爲了讓事情變得更加困難,我還會在導入它們時更改包的名稱 - 例如,matplotlib會將其縮寫爲mp。導入模塊時出錯處理

我想要做的只是加載我正在使用的系統上存在的那些模塊,並對那些沒有的模塊進行一些錯誤處理。我能想到的唯一方法是將每個導入語句放在自己的try塊中,這看起來非常不合邏輯。如果我將它們全部放在同一個try塊中,無論哪個模塊引發錯誤都會阻止後續模塊被加載。任何可能讓事情看起來更漂亮的想法?如果我不想改變他們的名字,這將是如此容易...

+2

的 「小鬼」 模塊應該幫助你。你可能想閱讀:http://docs.python.org/library/imp.html – mawimawi 2010-06-28 09:25:06

+1

@mawimawi:怎麼樣?請解釋並將您的評論擴展爲正確答案? (我閱讀了文檔,並不是很明顯,爲什麼我們想要使用該模塊比任何其他方法都要多) – smci 2014-08-05 20:48:37

回答

30

我不認爲try except塊是非pythonic;相反,它是處理Python導入的常用方法。

報價Dive into Python

還有很多其他用途 異常除了處理實際 錯誤條件。 標準Python庫中的常見用法是嘗試導入 模塊,然後檢查 它是否工作。導入不存在的模塊 將引發一個 ImportError異常。您可以使用 此基礎上定義的 功能,多層次的哪些模塊 可在運行時,或者 支持多種平臺( 平臺特定代碼被分離 成不同的模塊)。

下一個示例演示如何 使用異常來支持 特定於平臺的功能。

try: 
    import termios, TERMIOS      
except ImportError: 
    try: 
     import msvcrt       
    except ImportError: 
     try: 
      from EasyDialogs import AskPassword 
     except ImportError: 
      getpass = default_getpass   
     else:         
      getpass = AskPassword 
    else: 
     getpass = win_getpass 
else: 
    getpass = unix_getpass 
4

最簡單的方法是確保所有模塊可以在所有系統上加載。如果這不起作用,那麼將中的每個import包含在try塊中是下一個最好的解決方案,而不是非pythonic。

0

所提倡的https://stackoverflow.com/a/20228312/1587329 [改性]

named_libs = [('numpy', 'np'), ('matplotlib', 'mp')] # (library_name, shorthand) 
for (name, short) in named_libs: 
    try: 
     lib = __import__(name) 
    except: 
     print sys.exc_info() 
    else: 
     globals()[short] = lib 

出口所有庫中named_libs。第一個字符串是庫名,第二個是速記。對於未命名庫,你可以使用the original

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