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