【问题标题】:python catching NameError when loading modulepython在加载模块时捕获NameError
【发布时间】:2012-08-30 17:16:13
【问题描述】:

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

【问题讨论】:

    标签: python exception-handling module nameerror


    【解决方案1】:
    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
    

    【讨论】:

      【解决方案2】:

      当 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 方式。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-26
          • 2014-02-20
          • 1970-01-01
          • 1970-01-01
          • 2018-10-20
          • 2015-07-21
          相关资源
          最近更新 更多