导入Python库并在它们不可用时进行优雅处理

Ist*_*van 6 python exception-handling egg setup.py

我想导入一堆库并捕获异常.

如果我只有1个尝试catch块,我会得到1个异常(第一个).是否存在迭代所有库的模式,并且每个缺少的lib都有一个单独的例外?

#!/usr/bin/env python

try: import sys
except: print sys.exc_info()
try: import numpy as np
except: print sys.exc_info()
try: import scipy as sp
except: print sys.exc_info()
try: import os as os
except: print sys.exc_info()
try: from operator import itemgetter
except: print sys.exc_info()
try: import socket
except: print sys.exc_info()
try: import logging
except: print sys.exc_info()
try: from time import gmtime, strftime
except: print sys.exc_info()
Run Code Online (Sandbox Code Playgroud)

Ale*_*amo 9

您可以使用__import__动态导入模块,允许您 - 除其他外 - 通过使用其名称迭代列表来导入模块.

例如:

libnames = ['numpy', 'scipy', 'operator']
for libname in libnames:
    try:
        lib = __import__(libname)
    except:
        print sys.exc_info()
    else:
        globals()[libname] = lib
Run Code Online (Sandbox Code Playgroud)

您可以扩展它以处理import ... as ...from ... import ...表单,或者稍后手动执行分配,即:

np = numpy
sp = scipy
itemgetter = operator.itemgetter
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢此解决方案,因为它使用基本的python而不需要导入额外的库。 (3认同)

Mik*_*maa 6

虽然很常见,但不鼓励使用以下简单设计模式及其变体:

  # BAD, hides circular import etc. nested errors 
  try:
       import moolib
  except ImportError:
       raise ImportError("You must install moolib from http://moo.example.com in order to run this app")
Run Code Online (Sandbox Code Playgroud)

而是使用Python包管理器来检查libray是否可用:

# GOOD
import pkg_resources

try:
    pkg_resources.get_distribution('plone.dexterity')
except pkg_resources.DistributionNotFound:
    HAS_DEXTERITY = False
else:
    HAS_DEXTERITY = True
Run Code Online (Sandbox Code Playgroud)

有关该主题的更多信息,请点击此处

正如上面的评论所指出的,Python标准库模块(stdlib)始终可用,除非您在具有精简运行时的嵌入式环境中运行Python.