Съобщение за използване при използване на 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
Metavar е удобен за промяна на дисплея за използване, независимо от 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
Здравей Мартин, много благодаря за това, това е точно това, което търсих, брилянтно! - 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: metavar="command [args ...]", семантично това може да се разглежда като хак, но от гледна точка на крайния потребител решава проблема. - person Antonio Ospite; 01.04.2019