2011-07-04 8 views
5

Me preguntaba cómo puedo proporcionar una API para mi programa Python para permitir que otros lo amplíen con complementos. Pensé en algo como from myProgram.plugins import aClassToExtendByOthers, registerThatClass. Pero no tengo idea de cómo proporcionar esto.¿Cómo proporcionar una API para extender un programa de Python con complementos?

Podría usar una declaración ejecutiva dentro de mi función loadPlugins para cada complemento en la carpeta de complementos, pero esto no permitiría importar cosas que me gustaría proporcionar a las personas para escribir esos complementos.

+0

Aquí hay varias maneras [] (http : //zoomq.qiniudn.com/ZQScrapBook/ZqFLOSS/data/20060526140550/#command-dispatch-pattern) para implementar el patrón de envío de comando en Python. – martineau

Respuesta

2

Para un sistema que utilizo en varios de mis programas, defino un directorio de complementos y proporciono una clase de complemento base para todos los complementos a subclase. A continuación, importo todos los módulos en el directorio e inicializo selectivamente (comprobando si subclasifican mi clase de complemento base) y almaceno instancias de complementos en un diccionario (o lista). Descubrí que el command dispatch pattern me ha funcionado de manera efectiva como una forma de estructurar los complementos y pasar eventos. El complemento base (u otra clase de interfaz opcional) puede proporcionar los métodos que el complemento necesita para interactuar con la aplicación. Espero que esto ayude. Puede que no sea la mejor manera de hacerlo, pero me ha funcionado.

Además, podría hacer un filtrado adicional, como requerir que los archivos de complementos tengan un prefijo (por ejemplo, __plug_file.py__ y __plug_other.py__).

+0

Entonces, ¿simplemente usa una declaración ejecutiva o entendí mal? –

+0

No, importo los módulos usando la función \ _ \ _ import \ _ \ _, y luego uso inspeccionar para enumerar todas las clases en el módulo que acabo de importar. Este sistema permite que los complementos utilicen otros módulos, lo que usted dijo que era una de sus preocupaciones. Solo usar Exec en estos casos puede ser peligroso. –

+0

Hm, seguro que esto es mejor que el ejecutivo. ¿Pero cómo proporciono que el pluginwriter pueda usar las clases que le proporciono importándolos? (como se dice en la pregunta algo así como _de myProgram.plugins import extensiblePluginClass_) –

0

se puede utilizar el módulo imp (ver docs.python.org)

sys.path.insert(0, pluginsDir) 
lst = map(lambda x: os.path.splitext(os.path.basename(x))[0], glob.glob(os.path.join(pluginsDir, "*.py"))) 
for module in lst: 
try: 
    f, fn, d = imp.find_module(module,[pluginsDir]) 
    loaded = imp.load_module(module, f, fn, d) 

por ejemplo totalmente funcional ver el cargador de ojuba centro de control

http://git.ojuba.org/cgit/occ/tree/OjubaControlCenter/loader.py

Cuestiones relacionadas