python在加载模块时捕获NameError错误
python在加载模块时捕获NameError错误
我正在尝试捕获在无法加载模块时发生的任何异常。\n当前的结果是\"except\"块不会被执行。\n
import sys def loadModule(module): try: import module except: print """ 无法加载%s模块 对于此脚本,您需要安装以下模块: 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)
\n错误:\n
Traceback (most recent call last): File "./temp_script.py", line 16, inloadModule(cx_Oracle) NameError: name 'cx_Oracle' is not defined
在Python中,当加载模块时出现NameError的问题是由于以下原因导致的:在捕获异常时使用了过于泛化的代码except:
,而没有指定捕获的异常类型。在这种情况下,应该捕获的异常类型是ImportError
。另外,你在调用函数loadModule
时,传递给函数的参数应该是字符串类型,例如loadModule('cx_Oracle')
,这样就可以解决NameError
的问题。如果你想动态加载模块,可以参考Dynamic loading of python modules中的方法。
当加载模块时,Python会在调用loadModule
函数之前尝试查找cx_Oracle
变量,造成了这个错误。
如果你想保持当前的策略,你可能真的想使用像importlib.import_module这样的东西,这样你就可以通过名称导入模块,比如import_module('cx_Oracle')
。
我建议改为以下方式:
try: import cx_Oracle except ImportError: print "Can't load the Oracle module" dosomething()
将这段代码放在你的模块的顶层。这是处理这种情况的Pythonic方法。
当加载模块时,出现了Python捕捉NameError的问题。问题的原因是在代码中没有找到名为"cx_Oracle"的内容。因此,出现了NameError的错误。甚至还没有进入函数。
解决这个问题的方法是不能将变量传递给import语句,它会将你输入的内容解释为模块的字面名称。在这种情况下,建议将try/except语句移到模块级别,并直接导入cx_Oracle模块。
如果你好奇的话,这里是一种可以创建可重用的异常捕捉导入函数的方法。虽然我不确定它何时/如何有用,但是这里是一个示例代码:
from contextlib import contextmanager import sys def safe_import(name): try: yield except: print 'Failed to import ' + name sys.exit(1) with safe_import('cuckoo'): import cuckoo
希望以上内容能帮助你解决Python捕捉NameError的问题。