导入模块时的错误处理

问题描述 投票:0回答:4

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

我想做的只是加载我当前使用的系统上存在的模块,并对不存在的模块进行一些错误处理。 我能想到的唯一方法是将每个 import 语句包含在它自己的 try 块中,这看起来非常不符合 Python 风格。 如果我将它们全部放在同一个 try 块中,则无论哪个模块抛出错误都将阻止加载后续模块。 有什么想法可以让事情看起来更漂亮吗? 如果我不想改变他们的名字那就太容易了...

python error-handling module cross-platform
4个回答
77
投票

我不认为

try except
块是非Pythonic的;相反,这是处理 Python 导入的常见方法。

引用深入Python

还有很多其他用途 除了处理实际情况之外的异常 错误条件。 常见用途 标准Python库是尝试 导入一个模块,然后检查 是否有效。导入模块 不存在的将引发 导入错误异常。您可以使用 这定义了多个级别 基于哪些模块的功能 在运行时可用,或者 支持多个平台(其中 平台特定的代码是分开的 到不同的模块)。

下一个示例演示了如何 使用异常来支持 特定于平台的功能。

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

15
投票

正如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
中的所有库。第一个字符串是库名称,第二个字符串是简写。对于未命名的库,您可以使用原始

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

5
投票

最简单的方法是确保所有模块都可以在所有系统上加载。如果这不起作用,将每个

import
语句包含在
try
块中是下一个最佳解决方案,而且根本不符合 Python 风格。


0
投票
try:
  import pandas as pd
except ImportError as e:
  print('failed to import package : ' + str(e))
  exit()
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.