Estoy escribiendo una aplicación Python que toma como un comando como argumento, por ejemplo:módulo dinámico en Python
$ python myapp.py command1
Quiero que la aplicación sea extensible, es decir, que sea capaz de añadir nuevos módulos que implementan nuevos comandos sin tener que cambiar el origen de la aplicación principal. El árbol se ve algo como:
myapp/
__init__.py
commands/
__init__.py
command1.py
command2.py
foo.py
bar.py
Así que desea que la aplicación para encontrar los módulos de comando disponibles en tiempo de ejecución y ejecutar el apropiado.
Actualmente esto se implementa algo como:
command = sys.argv[1]
try:
command_module = __import__("myapp.commands.%s" % command, fromlist=["myapp.commands"])
except ImportError:
# Display error message
command_module.run()
Esto funciona muy bien, me pregunto si hay posiblemente una forma más idiomática para lograr lo que estamos haciendo con este código.
Tenga en cuenta que específicamente no quiero entrar al uso de huevos o puntos de extensión. Este no es un proyecto de código abierto y no espero que haya "complementos". El objetivo es simplificar el código de la aplicación principal y eliminar la necesidad de modificarlo cada vez que se agrega un nuevo módulo de comando.
¿Qué dice la fromlist = [ "myapp.commands"] hacer? –
@ PieterMüller: en un shell python, escriba esto: '' dir (__ import __) ''. La lista de salida debe ser una lista de nombres para emular "de importación de nombre ...". – mawimawi
[Importar módulo de variable de cadena] (http://stackoverflow.com/questions/8718885/import-module-from-string-variable) –