2016-05-02 6 views
1

Я сделаю приложение командной строки с возможностью плагина, каждый новый плагин будет вызываться подкомандой из сценария __main__.py.plugins pattern + sub command

Раньше я использовал argparse. Интересно, возможно ли с помощью argparse реализовать команду sud + плагин, похожий (я нашел какой-то инструмент, но использовал устаревшие пакеты)?

myfantasticCLI 
├── __main__.py 
└── plugins 
    ├── create.py 
    ├── notify.py 
    └── test.py 

Я знаю, что я мог бы использовать argparse для суб команды, но не знаю, как использовать его с динамической загрузкой способом. :/

ответ

1

Если инициализировать argparse subparsers с

sp = parser.add_subparsers(dest='cmd',...) 

то после разбора args.cmd будет имя выбранного subparser или команды.

Тогда простая if дерева может импортировать и запускать нужные модули

cmd = args.cmd 
if cmd in ['module1',...]: 
    import plugins.module1 as mod: 
    mod.run(...) 
elif cmd in ['module2',....]: 
    import plugins.module2 as mod: 
    ... 

Есть причудливые способы сделать это, но я предпочитаю, начиная с очевидным.

Также мое внимание сосредоточено на получении имени из анализатора cmd, а не на деталях импорта модуля с именем. Вам не нужно argparse, чтобы проверить часть проблемы import given a name.

+0

Звучит здорово, но это подразумевает явный импорт. Я хотел бы создать что-то плагин на основе http://stackoverflow.com/questions/932069/building-a-minimal-plugin-architecture-in-python. –

+1

Если все, что вам нужно от 'argparse', является именем плагина для импорта, механизм' subparsers' может быть слишком большим. Любой строковый аргумент будет работать. Вы даже можете собрать допустимые имена в параметре 'choice'. – hpaulj

+0

you'r right thanks :) –