2

我试图捕捉无法加载模块时发生的任何异常。当前的结果是“except”块没有被执行。

import sys 
def loadModule(module):
   try: 
      import module
   except: 
      print """ 
      Cannot load %s
      For this script you will need: 
         cx_Oracle:  http://cx-oracle.sourceforge.net/
         pycrypto:   https://www.dlitz.net/software/pycrypto/
         paramiko:   http://www.lag.net/paramiko/
       """ % module
      sys.exit(1)

loadModule(cx_Oracle)

错误:

Traceback (most recent call last):
  File "./temp_script.py", line 16, in <module>
    loadModule(cx_Oracle)
NameError: name 'cx_Oracle' is not defined
4

3 回答 3

5
loadModule(cx_Oracle)

你认为你传递给这个函数的是什么?cx_Oracle到目前为止,代码中没有任何名称。这就是您收到 NameError 的原因。你甚至没有进入这个功能。

 import module

您不能将变量传递给导入,它会将您输入的内容解释为模块的文字名称

在这种情况下,我怀疑你甚至需要一个函数。只需将 try/except 移动到模块级别并直接导入 cx_Oracle。

只是因为我很好奇,这里有一种方法可以制作可重用的异常捕获导入函数。我不确定它何时/如何有用,但这里是:

from contextlib import contextmanager
import sys

@contextmanager
def safe_import(name):
    try:
        yield
    except:
        print 'Failed to import ' + name
        sys.exit(1)

with safe_import('cuckoo'):
    import cuckoo
于 2012-08-30T17:19:58.177 回答
2

当 Python 试图在函数被调用之前查找cx_Oracle变量时,就会发生错误。loadModule

如果你想保持当前的策略,你可能真的想使用importlib.import_module这样的东西,这样你就可以按名称导入模块,比如import_module('cx_Oracle').

我建议做这样的事情:

try:
    import cx_Oracle
except ImportError:
    print "Can't load the Oracle module"
    dosomething()

在模块的顶层。这是处理这种情况的 Pythonic 方式。

于 2012-08-30T17:19:07.150 回答
1

始终考虑要捕获哪个异常。不要仅仅通过编码来概括except:。在这种情况下,您想要捕获ImportError. 您要传递给函数的参数loadModule应该是字符串类型,例如loadModule('cx_Oracle')(然后您将摆脱NameError)。要在其中动态加载模块loadModule,请查看例如Dynamic loading of python modules

于 2012-08-30T17:19:20.927 回答