Optionen in Argparse mit einem Bindestrich haben


154

Ich möchte einige Optionen im argparse-Modul haben, z. B. --pm-exportwenn ich versuche, es zu verwenden, args.pm-exporterhalte ich den Fehler, dass es kein Attribut gibt pm. Wie kann ich dieses Problem umgehen? Ist es möglich, -Optionen in der Befehlszeile zu haben?

Antworten:


226

Wie in den argparseDokumenten angegeben :

Bei optionalen Argumentaktionen wird der Wert von dest normalerweise aus den Optionszeichenfolgen abgeleitet. ArgumentParser generiert den Wert von dest, indem die erste lange Optionszeichenfolge verwendet und die ursprüngliche --Zeichenfolge entfernt wird . Alle internen -Zeichen werden in _Zeichen konvertiert, um sicherzustellen, dass die Zeichenfolge ein gültiger Attributname ist

Also solltest du verwenden args.pm_export.


108

Leider funktioniert das Ersetzen des Strichs zum Unterstrich nicht für Positionsargumente (ohne Präfix --) wie

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('logs-dir',
                    help='Directory with .log and .log.gz files')
parser.add_argument('results-csv', type=argparse.FileType('w'),
                    default=sys.stdout,
                    help='Output .csv filename')
args = parser.parse_args()
print args

# gives
# Namespace(logs-dir='./', results-csv=<open file 'lool.csv', mode 'w' at 0x9020650>)

Sie sollten also das erste Argument add_argument()als Attributname und metavarkwarg verwenden, um festzulegen, wie es in der Hilfe aussehen soll:

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('logs_dir', metavar='logs-dir',
                    nargs=1,
                    help='Directory with .log and .log.gz files')
parser.add_argument('results_csv', metavar='results-csv',
                    nargs=1,
                    type=argparse.FileType('w'),
                    default=sys.stdout,
                    help='Output .csv filename')
args = parser.parse_args()
print args

# gives
# Namespace(logs_dir=['./'], results_csv=[<open file 'lool.csv', mode 'w' at 0xb71385f8>])

7
Der relevante Python-Fehlerbericht: bugs.python.org/issue15125 . argparseverwendet setattrund getattr, daher müssen destNamen keine gültigen dotAttributnamen sein. Der Benutzer kann auch verwenden getattr.
hpaulj

5
Ich würde es einfach tunpositional_arg = getattr( parser, 'positional-arg' )
Ciro Santilli 5 冠状 病 病 事件 5

1
Genau das, was ich brauchte - ich habe es rückwärts gemacht metavarund konnte nicht herausfinden, warum es nicht funktionierte. Vielen Dank!
Dwanderson

17

Striche werden in Unterstriche umgewandelt:

import argparse
pa = argparse.ArgumentParser()
pa.add_argument('--foo-bar')
args = pa.parse_args(['--foo-bar', '24'])
print args # Namespace(foo_bar='24')

4
Nur für optionale Argumente. Erforderlich, um ihre Bindestriche zu behalten, benötigen Sie daher einen Unterstrich, um sie zugänglich zu machen.
n00dle
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.