Разрешение запуска скрипта Python даже для аргумента —help в argparse

#python #argparse

#python #argparse

Вопрос:

Я использую модуль Argparse в python для разработки инструмента командной строки. Вот код синтаксического анализатора:

 from argparse import ArgumentParser

def arguments():
    parser = ArgumentParser() 
    parser.add_argument('-c' , '--comms' , action = "store" , default = None , type = str , dest = "command",
                        help = 'Choosing a Command')
    parser.add_argument( '-s' , '--search' , action = 'store' , default = None , type = str , dest = 'search_path'  ,
                        help = 'Search for a command' )
    parser.add_argument(  '-f' , '--config' , action = 'store_true' ,
                        help = 'Show the present configuration')

    parser.add_argument('--flush_details' , action = "store_false" , 
                        help = "Flushes the current commands buffer") 
    
    return parser.parse_args() 

def main():
    
    parser_results = arguments() 

    #More code comes here to analyze the results 

 

Однако, когда я запускаю код python foo.py --help , он никогда не запускает скрипт post, анализирующий аргументы. Могу ли я что-нибудь сделать, чтобы остановить это поведение. Я хочу проанализировать результаты синтаксического анализатора, даже если его просто просят --help переключить.

Хотел бы знать, что я могу сделать, чтобы продолжить сценарий даже после --help того, как он был использован

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

1. Использование --help предназначено для печати справки и выхода , как и ожидалось от любого хорошо работающего инструмента командной строки. Таким образом, после этого ничего не должно запускаться, и анализировать нечего. Что вы на самом деле пытаетесь сделать?

2. Немой вопрос: почему? Если пользователь передал -help , что нужно проанализировать? Довольно универсально, что запрос справки выводит сообщение справки и завершает работу программы. Можете ли вы быть более конкретными в отношении вашего ожидаемого поведения? Ожидаете ли вы, что другие аргументы будут переданы вместе с -help аргументом? Пожалуйста, приведите еще несколько примеров выполнения с их ожидаемым результатом.

3. @Tomerikoo Эта программа фактически запускается с использованием пакетного файла. После завершения работы этой программы будет запущен другой файл. Однако параметры для этого файла должны быть изменены этим файлом. Поэтому, если это просто —help , следующая программа запускается с использованием параметров предыдущего выполнения. Чего я хочу избежать. Поэтому, если передается только —help и никаких других параметров, программа сбросит все параметры следующей конфигурации до значений по умолчанию. Чтобы не было проблем или двусмысленности. Вот почему я не хочу, чтобы программа завершала работу

4. @ThierryLathuille Скрипт устанавливает параметры для следующего запуска скрипта. Поскольку он выполняется при пакетном выполнении. Поэтому, если используется только —help , я хочу просто установить параметры по умолчанию; если программа завершит работу, у меня останутся параметры из предыдущего выполнения. Чего я хочу избежать.

Ответ №1:

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

Единственный способ, которым я могу создать изображение, — это удалить стандартную -h|--help обработку и установить свою собственную:

 parser = ArgumentParser(add_help=False) 
parser.add_argument('-h' , '--help', help = 'show this help', action='store_true')
...
 

Затем при обработке параметров вы просто добавляете:

 parser_results = parser.parse_args()
if parser_results.help:
    parser.print_help()
 

Ответ №2:

Как сказал пользователь Thierry Lathuille в комментариях, --help предназначен для печати справки и выхода.

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

 import argparse

parser = argparse.ArgumentParser(description="This script prints Hello World!")
parser.add_argument("-rh", "--runhelp", action="store_true", help="Print help and run function")

if __name__ == "__main__":
    args = parser.parse_args()
    if args.runhelp:
        parser.print_help()

    print('Hello World!')
 

Если имя скрипта main.py :

 >>> python main.py -rh
usage: main.py [-h] [-rh]

This script prints Hello World!

optional arguments:
  -h, --help      show this help message and exit
  -rh, --runhelp  Print help and run function
Hello World!
 

Редактировать:
Если вы настаиваете на использовании --help вместо пользовательского аргумента:

 import argparse

parser = argparse.ArgumentParser(description="This script prints Hello World!", add_help=False)
parser.add_argument("-h", "--help", action="store_true", help="Print help and run function")

if __name__ == "__main__":
    args = parser.parse_args()
    if args.help:
        parser.print_help()

    print('Hello World!')
 

Если имя скрипта main.py :

 >>> python main.py -h
usage: main.py [-h]

This script prints Hello World!

optional arguments:
  -h, --help  Print help and run function
Hello World!
 

Ответ №3:

Установите add_help параметр для argparse.ArgumentParser to False для отключения -h и --help :

 parser=argparse.ArgumentParser(add_help=False)
 

Затем добавьте --help :

 parser.add_argument('--help',action='store_true')
 

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

1. Вопрос заключается в том, как запустить скрипт при вызове с помощью —help и не отключать справку.