2011-09-14 2 views
2

저는 파이썬 (이미 작은 웹 서버 또는 로컬 네트워크 채팅과 같은 1h 스크립트를 사용했습니다)에 비교적 익숙하며 플러그인 관리자를 프로그래밍하려고합니다. 다음과 같은 기능을 가지고 있습니다 플러그인을위한 인터페이스, 거기 내 생각은 것을 :파이썬의 플러그인 관리자

getDependencies -> all dependencies of the plugin to other plugins 
getFunctions -> all functions that this plugin introduces 
initialize -> a function that is called when loading the plugin 

(필자는 플러그인이 초기화되는 순서를 결정하는 종속성의 위상 정렬 알고리즘을 가지고 상상할 수있다.)

각각의 플러그인이 자체 스레드에서 실행되며 연속적으로 실행될 함수 호출 대기열이있는 다중 쓰레드를 구현하고 싶습니다. 플러그인이 다른 플러그인의 기능을 호출 할 때, 관리자는 플러그인을 호출하여 함수 호출을 다른 플러그인의 큐에 삽입합니다.

관리자는 또한 플러그인이 자신의 이벤트를 등록하고 다른 이벤트의 리스너가 될 수있는 일종의 이벤트 시스템을 제공해야합니다.

또한 관리자/응용 프로그램을 종료하지 않고 코드가 변경되거나 스레드가 충돌 한 경우 플러그인을 다시로드 할 수 있기를 원합니다. 나는 이미 이것과 함께 How do I unload (reload) a Python module?을 읽었다.

한 번 더 명확하게하기 : 관리자는 서로 공통된 통신 인터페이스를 통해 플러그인을 지원하는 것 외에 다른 기능을 제공해서는 안됩니다 (플러그인을 필요로하지 않고 멀티 스레드 방식으로 실행할 수있는 기능). 이것을 인식하고) 업데이트/크래시 된 플러그인을 복원합니다.

제 질문은 다음과 같습니다. 파이썬에서 이것을 할 수 있습니까? 그리고이 러프 스케치에 설계 실수가 있다면? 나는 이것에 대한 좋은 충고에 감사 할 것입니다.

다른 "문학"가장 기본적인 수준에서 Implementing a Plugin System in Python

+0

몇 가지 구체적인 내용을 제공해 주시겠습니까? 플러그인은 실제로 무엇을해야하나요? Python의 기본 패키지 시스템에 연결하여 플러그인 시스템을 구현했습니다. 실이 아니거나 아무것도 작동하지 않습니다. :) –

+0

@bebrawWell 지금까지는 매우 보편적 인 디자인이었고 이후 프로젝트에서 다시 사용하도록 남겨두고 싶습니다. 그래도 괜찮 으면 지금까지는 세부 정보가 없습니다. – Nobody

+1

방금 ​​이걸 보았습니다. http://stackoverflow.com/questions/932069/building-a-minimal-plugin-architecture-in-python.당신은 아마도 거기에 몇 가지 출발점을 찾을 수 있습니다. –

답변

6

는, 우선, 당신은 당신의 응용 프로그램에 대해 기록 된 모든 플러그인에 대한 기본이다 기본 플러그인 클래스를 제공합니다.

다음으로 모두 가져 오기해야합니다. 파이썬 2.7 또는 3.1에서

class PluginLoader(): 
    def __init__(self, path): 
     self.path = path 

    def __iter__(self): 
     for (dirpath, dirs, files) in os.walk(self.path): 
      if not dirpath in sys.path: 
       sys.path.insert(0, dirpath) 
     for file in files: 
       (name, ext) = os.path.splitext(file) 
       if ext == os.extsep + "py": 
        __import__(name, None, None, ['']) 
     for plugin in Plugin.__subclasses__(): 
      yield plugin 

, 대신 __import__(name, None, None, ['']), 고려 :

import importlib # just once 
importlib.import_module(name) 

이 모든 플러그인 파일을로드하고 우리에게 모든 플러그인을 제공합니다. 그런 다음 원하는대로 플러그인을 선택하고 사용하십시오.

from multiprocessing import Process, Pipe 

plugins = {} 

for plugin in PluginLoader("plugins"): 
    ... #select plugin(s) 
    if selected: 
     plugins[plugin.__name__], child = Pipe() 
     p = Process(target=plugin, args=(child,)) 
     p.start() 

... 

for plugin in plugins.values(): 
    plugin.put("EventHappened") 

... 

for plugin in plugins.values(): 
    event = plugin.get(False) 
    if event: 
     ... #handle event 

이것은 처음에 생각해내는 것입니다. 육체에 대해서는 분명히 훨씬 더 많은 것이 필요할 것이지만, 그것은 일하기 좋은 근거가되어야합니다.