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 / exceptionをモジュールレベルに移動し、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

関数を呼び出すcx_Oracle前にPythonが変数を検索しようとすると、エラーが発生します。loadModule

現在の戦略を維持したい場合は、おそらくimportlib.import_moduleのようなものを使用して、モジュールをのような名前でインポートできるようにする必要がありますimport_module('cx_Oracle')

代わりに、次のようなことをお勧めします。

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

モジュールのトップレベルにあります。これが、この状況を処理するPythonの方法です。

于 2012-08-30T17:19:07.150 に答える
1

どの例外をキャッチしたいかを常に考えてください。コーディングだけで過度に一般化しないでくださいexcept:。この場合、をキャッチする必要がありImportErrorます。関数に渡したい引数はloadModule、文字列型である必要があります。たとえば、loadModule('cx_Oracle')(そうすると、が削除されますNameError)。内でモジュールを動的にロードloadModuleするには、たとえばPythonモジュールの動的ロードを参照してください。

于 2012-08-30T17:19:20.927 に答える