2012-03-20 22 views
8

Adı bilinmeyen bir modülün üyelerini almaya çalışıyorum. Bunun yerinePython modüllerini dinamik olarak içe aktarma

import foo 

I kullanıyorum:

__import__("foo") 

nasıl yerine "eval" başvurmadan arasında from foo import bar durum için de benzer bir şey elde edebilirsiniz?

Güncelleme: Görünüşe göre fromlist hile yaptı. from foo import *'u taklit etmenin bir yolu var mı? fromlist=['*'] hile yapmadı.

cevap

10

taklit etmek.

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 Bu kodu başka bir modülden kullanabilmem için globals() yerine __builtins__ kullanıyorum. –

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

fazla bilgi help(__import__)

+0

Teşekkürler. "Foo import * 'dan" taklit etmenin bir yolu var mı? – ustun

1

için dinamik __import__ yardımıyla alabilirsiniz. 'u aramak için __import__ numaralı fromlist anahtar bağımsız değişkeni vardır.

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

genellikle hoş karşılanmaz from foo import * kullanma ve daha çok edilir, sanırım taklit: Alınan modülün özellikleri almak için dir kullanabilirsiniz from foo import *

+0

Teşekkürler. "Foo import * 'dan" taklit etmenin bir yolu var mı? – ustun

0

Bazen sadece bunu yapamaz vs. aynı adlı değişkenler için farklı değerleri vardı, her biri birçok konfigürasyon dosyalarından birini, dicts,

almak istediğiniz Bunun neden işe yaramadığına dair açıklama maaşımın üstünde, kapanış ve isim alanlarını içeriyor. Gerçekten ihtiyacım vardı ne buldum çalıştı sonra dyamically özellikle değişken içe bir dize bağımsız değişken olarak 'MODULE_NAME' ile anne işlevini çağırmak oldu:

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__) 

Bingo .... herhangi bir değişkenin dyamic ithalat var İstediğiniz zaman, çalışma zamanında belirlenen bir ithal modülünden.

İlgili konular