Может ли argparse пересылать аргументы в другие файлы python?

#python #argparse

#python #argparse

Вопрос:

Я пишу CLI с сотнями аргументов и вложенных модулей на Python с помощью argparse. По понятным причинам я не хочу, чтобы все эти аргументы были собраны в одном файле python. Вместо этого я бы предпочел делегировать другим подмодулям и позволить пользователям добавлять свои собственные подмодули по желанию, которые будут автоматически обнаружены верхним уровнем argparser .

В качестве примера у нас может быть каталог, который выглядит следующим образом:

 - main.py
- foo.py
- bar.py
- baz/foo.py
...
  

Один допустимый вызов этого CLI будет:

 ./main.py foo --help
  

Это вызовет панель справки для argparse модуля в foo.py

Другим примером может быть:

 ./main.py baz foo --help
  

что приведет к появлению панели справки для argparse модуля baz/foo.py .

И, наконец,:

 ./main.py --help
  

Напечатал бы что-то вроде:

 Options are:
  foo
  bar
  baz
  

Если вы еще не догадались, этот шаблон виден в kubectl , который, кажется, неплохо организует множество опций.

Существует ли подобная библиотека или мне нужно создать свою собственную?

Комментарии:

1. ДА. Некоторые примеры для начала см. В ansible , где каждая подкоманда является модулем. Это не будет идеально соответствовать вашему примеру здесь (требование к вложенным пакетам / модулям необычно), но должно дать вам несколько мест для начала.

2. Похоже, они свернули свои собственные. Я надеялся на библиотеку, которая решала эту проблему в целом. Я знаю, что это не так много кода, но все помогает.

3. Это можно было бы сделать с argparse помощью функций в main и каждого скрипта, но вам придется выполнять большую часть работы по вызову соответствующих скриптов и sys.argv соответствующим настройкам. Это слишком большая тема для обсуждения здесь.

4. Имейте в виду argparse , что это в первую очередь инструмент синтаксического анализа, способ определения того, чего хочет ваш пользователь. Это не инструмент для выполнения или делегирования. Он анализирует sys.argv и возвращает args пространство имен. Вот и все (плюс некоторая проверка ошибок и форматирование справки).