Avere opzioni in argparse con un trattino


154

Voglio avere alcune opzioni nel modulo argparse come ad esempio --pm-exportquando provo ad usarlo come se args.pm-exportavessi l'errore che non c'è attributo pm. Come posso aggirare questo problema? È possibile avere -opzioni nella riga di comando?

Risposte:


226

Come indicato nei argparsedocumenti :

Per le azioni facoltative dell'argomento, il valore di dest viene normalmente dedotto dalle stringhe di opzioni. ArgumentParser genera il valore di dest prendendo la prima stringa di opzioni lunga e rimuovendo la --stringa iniziale . Tutti i -caratteri interni verranno convertiti in _caratteri per assicurarsi che la stringa abbia un nome di attributo valido

Quindi dovresti usare args.pm_export.


108

Sfortunatamente, la sostituzione da trattino a trattino basso non funziona per gli argomenti posizionali (non preceduti da --) come

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>)

Quindi, dovresti usare 1'st argomento add_argument()come nome dell'attributo e metavarkwarg per impostare come dovrebbe apparire nella guida:

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
Il relativo rapporto sui bug di Python: bugs.python.org/issue15125 . argparseusa setattre getattr, quindi i destnomi non devono essere dotnomi di attributi validi . L'utente può anche usare getattr.
hpaulj,

5
Lo farei solopositional_arg = getattr( parser, 'positional-arg' )
Ciro Santilli 5 冠状 病 六四 事件 法轮功 il

1
Esattamente quello di cui avevo bisogno: l'ho fatto al contrario metavare non sono riuscito a capire perché non funzionasse. Grazie!
Dwanderson,

17

I trattini vengono convertiti in caratteri di sottolineatura:

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

4
Solo per argomenti opzionali. Necessari per mantenere i loro trattini, quindi richiedono un carattere di sottolineatura per renderli accessibili.
n.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.