2010-06-28 219 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