导入模块时的错误处理

Dav*_*ltz 36 python error-handling cross-platform module

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

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

sys*_*out 48

我不认为try except块是非pythonic; 相反,它是处理Python导入的常用方法.

引用潜入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
Run Code Online (Sandbox Code Playgroud)

  • 这已经变得有点难看,并且随着“链”中条件导入数量的增加而变得更糟。在一个循环中使用 [`importlib.import_module`](https://docs.python.org/3/library/importlib.html#importlib.import_module) 可能是可行的,例如。迭代名称列表(`['termios', 'mscvrt', ...]`),直到找到一个工作模块。 (2认同)

ser*_*inc 6

/sf/answers/1415981871/所倡导[已修改,并通过@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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)


Phi*_*ipp 5

最简单的方法是确保所有模块都可以加载到所有系统上。如果这不起作用,那么将每个import语句包含在一个try块中是下一个最佳解决方案,而且完全不符合 Python 风格。