Я пишу приложение на Python, который принимает в качестве команды в качестве аргумента, например:Динамический модуль в Python
$ python myapp.py command1
Я хочу, чтобы приложение быть расширяемой, то есть, чтобы иметь возможность добавлять новые модули, которые реализуют новые команды без изменения основного источника приложения. Дерево выглядит примерно так:
myapp/
__init__.py
commands/
__init__.py
command1.py
command2.py
foo.py
bar.py
Так что я хочу приложение, чтобы найти доступные командные модули во время выполнения и выполнить соответствующую одну.
В настоящее время это реализовано что-то вроде:
command = sys.argv[1]
try:
command_module = __import__("myapp.commands.%s" % command, fromlist=["myapp.commands"])
except ImportError:
# Display error message
command_module.run()
Это прекрасно работает, я просто интересно, если есть, возможно, более идиоматический способ сделать то, что мы делаем с этим кодом.
Обратите внимание, что я специально не хочу использовать яйца или дополнительные точки. Это не проект с открытым исходным кодом, и я не ожидаю, что там будут «плагины». Дело в том, чтобы упростить основной код приложения и удалить необходимость его изменения каждый раз при добавлении нового командного модуля.
Что означает fromlist = [ "myapp.commands"] делать? – 2012-06-06 10:29:57
@ PieterMüller: в оболочке python введите это: `` dir (__ import __) ``. Список из списка должен быть списком имен для эмуляции «from name import ...». – mawimawi 2012-08-09 07:13:14
[Модуль импорта из строковой переменной] (http://stackoverflow.com/questions/8718885/import-module-from-string-variable) – 2015-08-12 18:28:00