导入模块时的错误处理

时间:2010-06-28 09:15:10

标签: python error-handling module cross-platform

这可能有一个明显的答案,但我是初学者。我有一个“模块”(实际上只是一个包含我经常使用的一系列函数的文件),在开始时我导入了许多其他模块。但是,由于我在许多系统上工作,并非所有模块都可以在任何特定计算机上加载。为了使事情稍微变得困难,我在导入时也会更改包的名称 - 例如,matplotlib缩写为mp。

我想要做的只是加载我正在使用的系统上存在的那些模块,并对那些不存在的模块进行一些错误处理。我能想到的唯一方法是将每个import语句放在它自己的try块中,这看起来非常不像pythonic。如果我将它们全部放在同一个try块中,那么抛出错误的模块将阻止后续模块的加载。任何可能让事情看起来更漂亮的想法?如果我不想改变他们的名字那就太容易了......

3 个答案:

答案 0 :(得分:43)

我认为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

答案 1 :(得分:5)

正如https://stackoverflow.com/a/20228312/1587329所倡导的[已修改,来自@Ian的编辑]

from importlib import import_module

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

导入named_libs中的所有库。第一个字符串是库名,第二个是速记。对于未命名的库,您可以使用the original

from importlib import import_module     

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

答案 2 :(得分:4)

最简单的方法是确保可以在所有系统上加载所有模块。如果这不起作用,将每个import语句括在try块中是下一个最佳解决方案,而不是非Pythonic。