Сообщение об использовании при использовании argparse.REMAINDER

У меня есть программа Python, которая принимает в качестве своего (единственного) позиционного аргумента командной строки одно или несколько выражений пути к файлу. Я использую argparse для синтаксического анализа CL и argparse.REMAINDER для переменной, содержащей пути к файлам. См. код ниже:

import argparse
import sys

# Create parser
parser = argparse.ArgumentParser(
    description="My test program")

def parseCommandLine():
    # Add arguments
    parser.add_argument('filesIn',
                        action="store",
                        type=str,
                        nargs=argparse.REMAINDER,
                        help="input file(s)")

    # Parse arguments
    args = parser.parse_args()

    return(args)

def main():
    # Get input from command line
    args = parseCommandLine()

    # Input files
    filesIn = args.filesIn

    # Print help message and exit if filesIn is empty
    if len(filesIn) == 0:
        parser.print_help()
        sys.exit()

    # Do something
    print(filesIn)

if __name__ == "__main__":
    main()

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

usage: test.py [-h] ...

Где ... представляет позиционный ввод. С точки зрения пользователя было бы более информативно, если бы вместо этого отображалось имя переменной (filesIn). Тем более, что ввод test.py -h приводит к следующему:

usage: test.py [-h] ...

My test program

positional arguments:
  filesIn     input file(s)

т.е. в строке использования отображается ..., но затем в списке позиционных аргументов используется filesIn.

Итак, мой вопрос: есть ли простой способ изменить это (т.е. всегда отображать filesIn)?


person johan    schedule 23.03.2015    source источник
comment
Метавар удобен для изменения отображения использования, независимо от значения narg.   -  person hpaulj    schedule 23.03.2015


Ответы (1)


Не используйте здесь argparse.REMAINDER. Вы не собираете все остальные аргументы, вы пытаетесь взять имена файлов.

Вместо этого используйте '+', чтобы захватить все оставшиеся аргументы в виде имен файлов, и вам нужен хотя бы один:

parser.add_argument('filesIn',
                    action="store",
                    type=str,
                    nargs='+',
                    help="input file(s)")

Это обеспечивает лучший вывод справки:

$ bin/python test.py 
usage: test.py [-h] filesIn [filesIn ...]
test.py: error: too few arguments
$ bin/python test.py -h
usage: test.py [-h] filesIn [filesIn ...]

My test program

positional arguments:
  filesIn     input file(s)

optional arguments:
  -h, --help  show this help message and exit
person Martijn Pieters    schedule 23.03.2015
comment
Привет Martijn, большое спасибо за это, это именно то, что я искал, гениально! - person johan; 23.03.2015
comment
Это, однако, не решает вопрос, указанный в заголовке. В моем случае я хочу использовать argparse.REMAINDER, и это дает бесполезное сообщение об использовании, указанное в вопросе. - person Jellby; 16.09.2015
comment
@Jellby: точка argparse.REMAINDER состоит в том, чтобы захватить оставшуюся часть командной строки, включая дополнительные необязательные переключатели, для последующей передачи другому синтаксическому анализатору. Если вы не собираетесь этого делать, не используйте argparse.REMAINDER. Если вы собираетесь сделать это, адаптируйте свое help сообщение к этому варианту использования и объясните, что в нем происходит. - person Martijn Pieters; 16.09.2015
comment
Верно. Под бесполезным я подразумеваю, что имя, появляющееся в сообщении об использовании, жестко запрограммировано на ..., а в описании аргумента используется имя аргумента. Лучшее, что можно сделать, это использовать metavar='...', по крайней мере, тогда имена совпадают. Но я бы предпочел, чтобы в сообщении об использовании было что-то вроде [extra_args]. - person Jellby; 17.09.2015
comment
В случае command и arguments вы можете отключить текст справки для arguments с помощью help=argparse.SUPPRESS и поиграть с метавариантом command: metavar="command [args ...]", семантически это может рассматриваться как взлом, но с точки зрения конечного пользователя это решает проблему. - person Antonio Ospite; 01.04.2019