Я пытаюсь создать скрипт Python, который будет выполнять другой скрипт, в зависимости от первого позиционного параметра. Подумайте о том, как ведет себя git add
.
Проблема в том, что ArgumentParser, кажется, хочет, чтобы позиционная подкоманда была в списке ... в конце. Что довольно нелогично. (Когда вы хотите вывести список всех файлов, вы делаете ls -a [FILE positional]
, а не -a ls [FILE positional]
, так почему бы ему потребовалось scriptname [optionals] subcommand
вместо scriptname subcommand [optionals]
, поскольку подкоманда - это настоящая команда?)
Пример игрушки:
def get_arg_parser():
parser = argparse.ArgumentParser()
# set up subprocessors
subparser = parser.add_subparsers(required=True)
parser.add_argument('--verbose', action='store_const', const=True, default=False, help="Enable verbose output.")
subcommand1_subparser = subparser.add_parser('subcommand1')
subcommand1_subparser.add_argument('--foo1', type=float)
subcommand2_subparser = subparser.add_parser('subcommand2')
subcommand2_subparser.add_argument('--foo2', type=float)
return parser
if __name__ == "__main__":
if len(sys.argv) > 1:
get_arg_parser().parse_args()
# more
else:
get_arg_parser().print_help()
Проблема в том, что если я пытаюсь запустить python toyexample.py subcommand1 --verbose
, он жалуется на error: unrecognized arguments: --verbose
. В то же время, python toyexample.py --verbose subcommand1
работает, но для него требуются необязательные перед именем команды, которую вы фактически собираетесь выполнить.
Как мне переопределить это?