2017-06-25 4 views
1

Meine Forderung:Wie fügt man mehrere Argumente Optionen in Python mit Argparse?

jetzt Denn wenn ich mit diesem Befehl meiner Python-Anwendung ausführen

python main.py -d listhere/users.txt 

Das Programm wird ausgeführt und die Ergebnisdatei als vordefinierten Namen speichern sagen reports.txt

Jetzt möchte ich diese Funktionalität hinzufügen, um Benutzern zu ermöglichen, zu wählen, was den Dateinamen und wo zu speichern, so

Alles ist gleich, aber ich möchte ein anderes Argument -o übergeben werden, das den Filpath und den Namen bestimmt, die gespeichert werden sollen. Wie mache ich es. Was ist der beste Weg, mehrere Optionen zu behandeln oder zu kombinieren?

ich versuchte, diesen

parser = argparse.ArgumentParser(description = "CHECK-ACCESS REPORTING.") 
    parser.add_argument('--user','-d', nargs='?') 
    parser.add_argument('--output','-d -o', nargs='?') 
    parser.add_argument('--input','-i', nargs='?') 
    args = parser.parse_args(sys.argv[1:]) 

    if args.output and args.input: 
     #operation that involves output filename too 
    elif args.user and not args.input: 
     #default operation only 
    else: 
     #notset 

ich diese Störung erhalte beim Versuch, das Problem auf diese Weise

Fehler zu beheben:

report.py: Fehler: Unbekanntes Argument : -o listehier/users.txt

+0

Sie können keine '-' Optionen an eine andere' -' Option anhängen, nein, '-d -o' ist hier kein gültiger Optionsname. Warum haben Sie nicht einfach eine '-o'-Option, um den Ausgabenamen anzugeben? –

+0

remove -d und es wird funktionieren – Stack

+0

Warum ich das tat ist, wenn ich nicht einige Werte nach -d es wird nicht funktionieren. Wie man -d als nur den Parameter ohne Wert einstellt. Versucht das Anfügen von default = '' an -d aber funktioniert nicht –

Antwort

1

A nargs='?' gekennzeichnet Option auf 3 Arten arbeitet

parser.add_argument('-d', nargs='?', default='DEF', const='CONST') 

Kommandozeile:

foo.py -d value # => args.d == 'value' 
foo.py -d  # => args.d == 'CONST' 
foo.py   # => args.d == 'DEF' 

https://docs.python.org/3/library/argparse.html#const

Taking Vorteil davon, sollten Sie nichts wie diese fehlerhafte -d -o Flagge benötigen.

Wenn Sie den Parameter const nicht verwenden, verwenden Sie nicht '?'

parser.add_argument('--user','-u', nargs='?', const='CONST', default='default_user') 
parser.add_argument('--output','-o', default='default_outfile') 
parser.add_argument('--input','-i', default='default_infile') 
+0

Dank sehr beschreibend war ich sehr unklar über default, const –

+0

Ein anderer Gedanke: '-d -o 'ist in zwei Strings durch die' bash' aufgeteilt; manchmal hilft es, 'sys.argv' zu betrachten, um herauszufinden, mit was' argparse' zu ​​arbeiten hat. – hpaulj

+0

können Sie dies bitte betrachten 'python testing.py -d -i somevalue -o somevalue' Ich möchte keinen Wert nach -d übergeben, was dazu führt, dass die Bedingung nicht erfüllt wird 'if args.users: if args.input and args. output' –

0

Haben Sie so etwas wie dieses haben wollen:

import argparse 

def main(): 
    parser = argparse.ArgumentParser(
     description='Check-Access Reporting.', 
     formatter_class=argparse.ArgumentDefaultsHelpFormatter, 
    ) 
    parser.add_argument(
     '-d', 
     dest='discrepancy', 
     action='store_true', 
     help='Generate discrepancy report.', 
    ) 
    parser.add_argument(
     '--input', 
     '-i', 
     default='users.txt', 
     help='Input file for the report.', 
    ) 
    parser.add_argument(
     '--output', 
     '-o', 
     default='reports.txt', 
     help='Output file for the report.', 
    ) 
    args = parser.parse_args() 

    if args.discrepancy: 
     print('Report type: {}'.format(args.report_type)) 
     print('Input file: {}'.format(args.input)) 
     print('Output file: {}'.format(args.output)) 
    else: 
     print('Report type is not specified.') 

if __name__ == '__main__': 
    main() 

Ergebnis Option --help:

usage: ptest_047.py [-h] [-d] [--input INPUT] [--output OUTPUT] 

Check-Access Reporting. 

optional arguments: 
    -h, --help   show this help message and exit 
    -d     generate discrepancy report (default: False) 
    --input INPUT, -i INPUT 
         input file for the report (default: users.txt) 
    --output OUTPUT, -o OUTPUT 
         output file for the report (default: reports.txt) 

Ohne jede Option (oder fehlende Option -d):

Report type is not specified. 

Mit der Option -d :

Report type: discrepancy 
Input file: users.txt 
Output file: reports.txt 

Mit -d --input input.txt --output output.txt:

Report type: discrepancy 
Input file: input.txt 
Output file: output.txt 
+0

übergeben haben. Das Problem besteht darin, dass Sie einen Wert nach -d Flags übergeben müssen Ich möchte nur das Flag -d ohne Wert darauf übergeben –

+0

@TaraPrasadGurung Die Reihenfolge der Optionen ist egal, zB: -o output.txt -i input.txt -d. Option -d hat keinen Wert in der Befehlszeile. Wenn die Option irgendwo in der Befehlszeile verwendet wird, setzt sie die Variable "Diskrepanz" auf "wahr". –

Verwandte Themen