2013-07-29 20 views
2

我正在寫一個應用程序在python中,它將被導出到py2exe的可執行文件。我正在嘗試編寫一個插件系統,這個插件系統在應用程序是一個exe文件時可以工作。Python插件的能力

我最初的代碼看起來像

import os 
Plugins=os.listdir('plugins') 
for P in Plugins: 
    PItems=os.path.splitext(P) 
    PName=PItems[0] 
    if PItems[len(PItems)-1]=='.py': 
     Mod=__import__('plugins.'+PName,fromlist=['*']) 
     Mod.init() 

但是,當出口到exe文件無法找到該模塊的插件。(pluginName)'它會嘗試當進口。

插件還應該能夠導入my_application來訪問應用程序api。

mcEdit(用python編寫)和Sublime Text(不確定)可以做到這一點,但儘管拖網源代碼,我無法找到如何。

我怎樣才能寫出什麼東西,將導出到exe文件時工作?

編輯: 澄清

  • 插件應該被加載的應用程序加載時自動。它們存儲在plugins/目錄
  • 插件應該能夠與import myapplication然後運行的API調用的應用程序進行交互,例如myapplication.getFoo()myapplication.setBar(Bar)
  • 這些插件可以如鼠標點擊或移動一次或事件運行或者甚至每次畫出畫面。我希望他們在應用程序運行時保持其狀態(變量值,對象等)。
+0

您是否確定當前的工作目錄是您期望的和您的模塊搜索路徑? (這是我處理動態加載模塊時遇到的主要問題,但我沒有使用py2exe) – Gryphius

+0

我該怎麼做? – Bonzo

+0

檢查'os.getcwd()'和'sys.path' – Gryphius

回答

0

好的。我想我有一個答案。

的文件結構如下:

api/ 
    - __init__.py 
    - etc... 
plugins/ 
    - plugin.py 
    - etc... 
- MainScript.py 
- PyExeCreator.py 

的MainScript.py樣子:

import os,sys, api 

RootDir=os.getcwd() 
#Add this directory to export 
if RootDir not in sys.path: 
    sys.path.append(RootDir) 

#Plugin stuff 
def LoadPlugins(): 
    PluginsDir=os.path.join(RootDir,'plugins') 
    Plugins=os.listdir(PluginsDir) 

    Modules=[] 
    for P in Plugins: 
     PItems=os.path.splitext(P) 
     PName=PItems[0] 
     if PName!='__init__' and PItems[len(PItems)-1]=='.py': 
      print "Loading plugins."+PName 
      Mod=__import__("plugins."+PName,fromlist=['*']) 
      Modules.append(Mod) 
    return Modules 
def RunPlugins(Modules): 
    for Plugin in Modules: 
     Plugin.Run() 

Plugins=LoadPlugins() 

#Just checking plugins can modify variables. 
api.Run() 
RunPlugins(Plugins) 
api.Run() 

的API/__ init__.py看起來像:

MOTD="HI" 
def Run(): 
    global MOTD 
    print "API MOTD: "+MOTD 

可能會成爲一個更令人興奮的API。 插件/ plugin.py

import api 
def Run(): 
    api.MOTD="HELLO WORLD!" 
    print "This is a plugin running!" 

而且重要的是編譯器PyExeCreator.py

from distutils.core import setup 
import py2exe 

setup(
    name='Tester', 
    console=['Loader.py'], 
    packages=['api'] 
) 

我缺少的是包括distutilspackages API和設置搜索目錄爲當前目錄的關鍵位(sys.path.append(os.getcwd())