2012-03-20 16 views
8

名前がわからないモジュールのメンバーをインポートしようとしています。代わりにPythonモジュールを動的にインポートする

import foo 

の私が使用しています:

__import__("foo") 

どのように私は、代わりに「evalの」に頼るのfrom foo import bar場合についても同様のことを達成することができますか?

更新:と思われます。fromlistと思われます。 from foo import *をエミュレートする方法はありますか? fromlist=['*']はやっていませんでした。

答えて

10

from foo import *を使用して

foo = __import__('foo') 
for attr in dir(foo): 
    if not attr.startswith('_'): 
     globals()[attr] = getattr(foo, attr) 

は、一般的に眉をひそめるされ、さらにそれをエミュレートし、私は想像します。

def mother_function(module, *args, **kwargs): 
    from module import variable 
    return variable 

def call_home_to_mamma(): 
    import module_42 
    return mother_function(module_42) 

+0

+1他のモジュールからこのコードを使用できるように、globals()ではなく__builtins__を使用しています。 –

9
__import__("foo", fromlist=["bar"]) 

詳しくhelp(__import__)

+0

ありがとうございました。 「foo import *から」エミュレートする方法はありますか? – ustun

1

のためにあなたは、動的に__import__の助けを借りてインポートすることができます。 fromlistのキー引数が__import__にあり、from foo import barを呼び出します。あなたがインポートされたモジュールの属性を取得するためにdirを使用することができfrom foo import *をエミュレートするため

+0

ありがとうございます。 「foo import *から」エミュレートする方法はありますか? – ustun

0

は、時には、あなただけのこの操作を行うことができないなど、同じ名前の変数に異なる値を持っていたそれぞれの多くの構成ファイルの1つ、dicts、

をインポートしたいですなぜこれがうまくいかないかについての説明は私の給与等級を上回り、クロージャーと名前空間を含んでいます。私が働いていたことは、私は本当にそれを必要なときにdyamically特定の変数をインポートし、文字列の引数として「モジュール名」で母関数を呼び出すことだった:

def mother_function(module_name, *args, **kwargs): 
    exec('from %s import %s' % (module_name, variable)) 
    variable = eval(variable) 
    return variable 

def call_home_to_mamma(): 
    import module_42 
    return mother_function(module_42.__name__) 

ビンゴ....あなたが任意の変数のdyamic輸入を持っていますインポートされたモジュールから、実行時に決定されるようにします。