2013-07-29 1 views
2

py2exe로 실행 파일로 내보낼 응용 프로그램을 파이썬으로 작성했습니다. 응용 프로그램이 exe 일 때 작동하는 플러그인 시스템을 작성하려고합니다.Python Plugin Capability

내 원래 코드는

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 (파이썬으로 작성) 및 Sublime Text (확실하지 않음)이 작업을 수행 할 수 있지만 소스 코드를 트래킹하는 동안에도 내가 어떻게 찾을 수 없습니까.

exe로 내보낼 때 어떻게 동작할까요?

편집 :

  • 플러그인은 자동으로 응용 프로그램이로드 될 때로드해야

    명확합니다. 그들은 같은 myapplication.getFoo() 또는
  • 이러한 플러그인 myapplication.setBar(Bar)는 마우스 클릭이나 움직임으로 한 번 또는 이벤트에서 실행 할 수
  • 플러그인이 import myapplication 다음 API 호출을 실행하는 응용 프로그램과 상호 작용할 수 있어야한다 plugins/ 디렉토리에 저장됩니다 심지어는 화면을 그릴 때마다 나는 그들이 응용 프로그램이 실행되는 동안 그들의 상태 (변수 값, 객체 등 ...)를 유지하고 싶습니다.
+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'] 
) 

내가 distutils에 대한 packages의 API를 포함하고 현재 디렉토리의 검색 디렉토리를 설정되었다 된 키 비트 (sys.path.append(os.getcwd()))

관련 문제