加载模块时python捕获NameError

时间:2012-08-30 17:16:14

标签: python exception-handling module nameerror

我正在尝试捕获无法加载模块时发生的任何异常。 目前的结果是“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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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方法。

答案 2 :(得分:1)

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