导入模块时的错误处理

61 投票
3 回答
103747 浏览
提问于 2025-04-16 00:31

这可能是个显而易见的问题,但我还是个新手。我有一个“模块”(其实就是一个包含我常用函数的文件),在文件开头我导入了一些其他模块。不过因为我在很多不同的系统上工作,并不是所有模块都能在某台机器上加载。更麻烦的是,我在导入这些模块时还会改名字,比如把matplotlib简化成mp。

我想做的是,只加载当前系统上存在的模块,并对那些不存在的模块进行错误处理。我能想到的办法就是把每个导入语句放在自己的try块里,但这样看起来不太符合Python的风格。如果把它们都放在同一个try块里,哪个模块出错了,就会阻止后面的模块加载。有没有什么办法可以让代码看起来更整洁呢?如果我不想改名字,那就简单多了……

3 个回答

5

最简单的方法是确保所有模块都能在所有系统上加载。如果这样做不行,那么把每个 import 语句放在一个 try 块里就是下一个不错的解决方案,这样做在Python中也是很常见的。

15

正如这个链接所提到的(经过@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里列出的库。第一个字符串是库的名字,第二个是它的简写。如果有一些库没有名字,你可以使用原来的方法

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
76

我觉得 try except 这种写法并不是不符合Python风格;相反,它是处理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

撰写回答