2010-12-22 105 views
0

我想創建一個插件系統,我有一個將所有模塊導入到數組中的函數。插件的多個導入相同的文件名

佈局:

PLUGINSDIR/

PLUGINSDIR /聊天

PLUGINSDIR /聊天/ main.py

這是查找並導入功能插件:

if os.path.exists(pluginsDir): 
    for path, dirArray, fileArray in os.walk(pluginsDir): 
     for fileName in fileArray: 
      if fileName == "main.py": 
      sys.path.append(path) 
      try: 
       plugins.append(__import__("main")) 
      except: 
       print 'Could not import plugin, "'+path+'": plugin contains errors or is not a real plugin.' 

這很好,如果我只有一個插件,但是當我有多個插件時,它會不斷導入它檢測到的第一個插件。插件的

佈局:

PLUGINSDIR/

PLUGINSDIR /聊天

PLUGINSDIR /聊天/ main.py

PLUGINSDIR /建

PLUGINSDIR /編譯/主.py

我試過在我的try語句後添加sys.path.remove(path),但是它並沒有在我已經導入模塊後刪除路徑。

我能做些什麼來正確導入我的插件?

回答

4

sys.path.append(path)將插件文件夾附加到sys.path。由於Python從前到後搜索sys.path中的文件夾,因此在列表末尾追加其他路徑將不會被找到,因爲前面sys.path中指定的文件夾中的任何main.py模塊實質上都會隱藏列表末尾的文件夾中的模塊。相反,您可以使用sys.path.insert(0, path)將新路徑添加到列表的前面。

您應該看看Python packages以更好地構建插件。

sys.path.insert(0, path_to_plugindir) 
for folder in dirArray: 
    __import__(folder) 
0

您的內循環不縮進,我不明白爲什麼您的代碼運行。修復縮進可能會解決問題。

+1

那是因爲我修改我的代碼更可讀的就在這裏,但我最終帶走了一些縮進:

plugindir/ __init__.py plugin1/ __init__.py plugin2/ __init__.py 

有了Python包,在你的腳本中的循環,可以方便地與實施。 – MetaDark 2010-12-22 16:51:35

2

Python模塊系統只是處理命名空間的一種非常酷的方式。將多個具有相同名稱的模塊導入當前名稱空間會使其混亂。

不需要遍歷pluginsDir並導入每個文件,Python會爲你做這件事(來自pluginsDir import *)。如果main.py只執行初始化stuf,則可以將代碼移動到pluginsDir/chat/__init__.py

導入pluginsDir引用您的插件,如'pluginsDir.chat'被認爲是更好的實踐。

+0

我需要用我的方法來做到這一點,因爲插件是動態的,而不是靜態的,所以如果添加插件,我的腳本將無法使用此方法檢測到它。 – MetaDark 2010-12-22 16:53:24

+0

您可以使用內置函數重新加載。 http://docs.python.org/library/functions.html#reload – 2010-12-22 17:09:12

相關問題