-->

加载模块时,蟒蛇捕捉NameError(python catching NameError when

2019-09-21 23:34发布

我试图赶上这种情况发生时,你不能加载模块任何异常。 目前的结果是,该“除”块没有得到执行。

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

Answer 1:

loadModule(cx_Oracle)

你觉得要传递到这个功能呢? 没有什么命名cx_Oracle在到目前为止的代码。 这就是为什么你得到一个NameError。 你甚至没有进入的功能。

 import module

你不能传递变量导入,它解释你把什么作为模块的文字名称

在这种情况下,我的问题,你甚至需要一个功能。 只要将尝试/除了直接在模块级和进口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


Answer 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()

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



Answer 3:

总在想你想赶上哪些异常。 不要只是编码overgeneralize except: 。 在这种情况下,你想赶上ImportError 。 你想传递给你的函数的参数loadModule应该是字符串类型,例如loadModule('cx_Oracle')那么你将摆脱的NameError )。 对于动态负载内的模块loadModule看看例如Python模块动态加载 。



文章来源: python catching NameError when loading module