2011-05-10 61 views
1

我試圖做一個__init__.py加載模塊並實例化dinamically內部同名類。有了這樣使用__init__.py加載動態python模塊的問題

importer/ 
    __init__.py   # The file i'm writing 
    asd.py    # It contains class asd 
    bsd.py    # It contains class bsd 

而且__init__.py文件樹

importername=__name__ 

def load(modname,paramlist = []): 

    if modname in globals(): 
    print 'Module %s already loaded.' % (modname) 
    else: 
    imported_mod = __import__(importername + '.' + modname, fromlist = ["*"]) 
    try: 
     globals()[modname]=getattr(imported_mod,modname)(*paramlist) 
    except Exception, e: 
     print 'Module %s not loaded: %s.' % (modname, e) 

如果我運行

import importer 
importer.load('asd') 
print importer.asd.name 
'ASD!' 

它的工作原理就像一個魅力,但如果我跑

from importer import * 
load('asd') 
print asd.name 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
NameError: name 'asd' is not defined 

燦我以某種方式修復它?謝謝。

+0

動態更新全局變量在Python中被認爲是不好的做法。你真的想要這樣做?可能有更好的方法。 – 2011-05-10 21:37:32

+0

看看我在Ned答案中的評論。 – Emilio 2011-05-10 22:08:46

回答

1

在Python中沒有真正全球化的東西。當您在importer/__init__.py中使用全局變量()時,您正在訪問模塊的名稱空間。你的第二個非工作樣品是向進口商添加'asd',而不是添加到你的測試模塊。

最好的你可以是修改進口商那麼你可以這樣做:

from importer import * 
asd = load('asd') 
print asd.name 

但托馬斯ķ提示:這是種奇怪的,也許還有一個更簡單的解決你的問題呢?

+0

我需要一系列可以動態加載的singleton類,並且可以在程序的每個部分訪問,例如import語句offer。 – Emilio 2011-05-10 22:07:23

+0

@Emilio:呃,至少對我來說,這並不明顯。你真的想要解決什麼問題? – 2011-05-10 22:28:58

+0

我需要一種插件工廠,加載一次,必須加載並實例化目錄中的插件(使用.load()和.unload())。 '進口'的方式是好的,因爲我需要從代碼中的任何地方到達這個工廠。 – Emilio 2011-05-10 22:53:24