2010-10-30 9 views
5

Estoy escribiendo un applet de python para la adquisición de datos de instrumentos científicos y estoy tratando de encontrar la mejor manera de administrar los "controladores" de mi dispositivo.Carga retardada de módulos en python

Cada controlador está representado por un módulo de python separado en el paquete que es mi programa. Cada uno implementa una interfaz estándar, pero principalmente es una lista gigantesca de comandos (y asignaciones de función) que son específicos para cada dispositivo y bus involucrados. A la larga, (estoy escribiendo esto para mi grupo de laboratorio y planeo dar soporte a unas pocas docenas de dispositivos), quiero evitar cargarlos todos a la vez. En cambio, en el tiempo de ejecución, quiero leer una lista de módulos en un diccionario/lista y luego cargarlos solo cuando realmente los necesite.

Cuando el usuario quiere usar un nuevo dispositivo, selecciona el controlador que usará y pasa el nombre al subsistema del controlador que verifica si ese controlador está en la lista de módulos cargados, y si no lo está , llama a la función __import__ y carga el controlador en la instancia de un objeto del dispositivo utilizando el controlador y se lo devuelve al usuario para su uso.

Mi pregunta es: ¿Cuál es la mejor manera de obtener una lista de todos los módulos de una manera relativa? Lo que quiero decir es que, si sé que los controladores están ubicados en ..drivers ¿hay alguna manera de obtener una lista ordenada de módulos en ese subpacakage? Para ilustrar: usualmente llamo al from ..drivers import driver_name para importar el módulo, pero como no estoy seguro de que sea en el directorio del paquete, no podemos simplemente llamarnos os para obtener una lista de nombres de módulos.

En cualquier caso, cualquier idea (incluso tal vez una mejor manera de lograr lo que quiero - "controladores" cargables) sería apreciada.

Respuesta

3

Si se conoce la ubicación de los paquetes de controladores, puede usar la ruta absoluta a la (s) carpeta (s) del controlador.

Creo que un enfoque más sólido sería tener una lista de todos los controladores conocidos para su programa, tal vez junto con un poco de metadatos para que los usuarios puedan elegirlos más fácilmente. Puede hacer que los controladores se registren o registrarlos usted mismo si conoce ubicaciones posibles. Una ventaja de que los controladores se registren es que puede tener archivos Python que no sean controladores en los directorios del paquete de controladores.

Editar

Para un piloto de "registrarse a sí mismo", se podría hacer algo como esto:

if __name__ == "__main__": 
    import mamapackage 
    mamapackage.register("thisdriver", 
       os.path.abspath(__file__), 
       "A description of this driver") 

Luego, en su propio paquete, proporcionar una función de "registro" que actualiza una lista de controladores, con sus ubicaciones y descripciones (un archivo de texto simple debería servir para principiantes).

+0

¿Qué debo hacer para que los conductores se registren? Implementarlos con pequeños guiones para encontrar mi software y registrarse? o algo más inteligente? – crasic

+0

Gracias por la gran sugerencia, implemento un archivo de texto simple para mantener los nombres y metadatos de los controladores, quizás no la mejor solución a largo plazo (cuando las personas quieran importar controladores externos), pero definitivamente funciona como un encanto por el momento. – crasic

3

Hay pkgutil que tiene iter_modules. (Nota: The Python 2 documentation no menciona esa función, pero funciona muy bien para mí en Python 2.6.)

También puede hacerlo de forma manual utilizando __file__, os.path y os.listdir.

0

¿Por qué no hacer un paquete de todos los controladores? Posteriormente, se podría

import drivers 
drivers.load("device1") 

donde la función load mantiene una asignación del nombre del dispositivo al módulo en el paquete?A continuación, puede importar dinámicamente cada uno de los módulos necesarios cuando sea necesario ...

Cuestiones relacionadas