2009-04-20 26 views
7

モジュールの名前が与えられている場合、どのようにモジュールのセットがインストールされているかどうかをテストできます。例えば。インストールされているPythonモジュールの依存関係のテスト

modules = set(["sys", "os", "jinja"]) 

for module in modules: 
    # if test(module exists): 
    # do something 

それはとしてテストを書くことは可能ですが:これは私がやっている何のために少し面倒です

try: 
    import sys 
except ImportError: 
    print "No sys!" 

。これを行うための動的な方法はありますか?

私はeval( "import%s"%module)を試しましたが、コンパイルエラーが表示されました。

あなたの考えや提案に感謝します。ありがとうございました。

答えて

8

あなたはこのよう__import__()機能を使用することができます::

for module in modules: 
    try: 
     __import__(module) 
    except ImportError: 
     do_something() 

あなたはまた、モジュールは、それをインポートしずにを見つけることができるかどうかを判断するためにimp.find_moduleを使用することができます::

import imp 
for module in modules: 
    try: 
     imp.find_module(module) 
    except ImportError: 
     do_something() 

ああ、 eval()を使用できない理由は、importが式ではなく式であるためです。あなた私はそれをお勧めしませんけれども、あなた本当には、したい場合はexecを使用::

for module in modules: 
    try: 
     exec 'import ' + module 
    except ImportError: 
     do_something() 
6

この問題は何ですか?

上記は__import__機能を使用しています。また、それが存在するかどうかを厳密にテストしています。実際にインポートをどこにも保存していないのですが、それを簡単に変更できます。

2
modules = set(["sys", "os", "jinja"]) 
try: 
    for module in modules: 
    __import__(module) 
    doSomething() 
except ImportError, e: 
    print e 
5

それはfind_moduleアプローチと__import__アプローチの間のトレードオフを理解する価値があることができます。

  • __import__('foo')は、読み込まれたモジュールへの参照を保存するかどうかにかかわらず、モジュールの読み込みの副作用を引き起こします。それはOKかもしれないし、そうでないかもしれない。
  • find_module('foo')は、いかなる副作用も引き起こさないので、常に安全でなければなりません。
  • どちらのアプローチは、モジュールが発見された場合にうまく動作しますが、あなたは障害を処理する方法に応じて、ロード時に他の問題(例えばにSyntaxError、NameError、...)
  • を持って、単に与える除いて/試しに__import__('foo')を包みますfooが見つかりましたがfooのインポートバーがでない場合は、誤った結果になりますが見つかりました。あなたは「foo.bar.bat.baz」のインポートすることができるかどうかをチェックする必要がある場合、あなたはdocs.
あたりとしてfind_moduleとload_moduleする複数の呼び出しを使用する必要がありますので
  • find_module()は、点線の名を処理することはできません
  • 関連する問題