Python argparse ignora gli argomenti non riconosciuti


206

Optparse, la vecchia versione ignora solo tutti gli argomenti non riconosciuti e continua. Nella maggior parte dei casi, questo non è l'ideale ed è stato modificato in argparse. Ma ci sono alcune situazioni in cui vuoi ignorare qualsiasi argomento non riconosciuto e analizzare quelli che hai specificato.

Per esempio:

parser = argparse.ArgumentParser()
parser.add_argument('--foo', dest="foo")
parser.parse_args()

$python myscript.py --foo 1 --bar 2
error: unrecognized arguments: --bar

Esiste un modo per sovrascrivere questo?


14
Molto utile se stai scrivendo un wrapper su un altro programma e vuoi catturare e modificare alcuni argomenti, ma passa il resto!
Alan De Smet,

2
Esattamente perché sono finito qui @AlanDeSmet! Sono contento di non provare a fare qualcosa di pazzo :)
Dwanderson il

Risposte:


351

Sostituire

args = parser.parse_args()

con

args, unknown = parser.parse_known_args()

Per esempio,

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo')
args, unknown = parser.parse_known_args(['--foo', 'BAR', 'spam'])
print(args)
# Namespace(foo='BAR')
print(unknown)
# ['spam']

21
+1 - non sapevo che ci fosse qualcosa del genereparse_known_args
avasal

7
Nemmeno io! L'ho persino perso nei documenti docs.python.org/library/… . Grazie
joedborg il

1
Ciò è emerso quando si è cercato di utilizzare nosetest con parseargs (si è rifiutato di consentire l'utilizzo di arg nosetest) il motivo era perché lo stavo facendo parser.parse_args(None)piuttosto che parser.parse_args([])nei miei test.
Andy Hayden,

3
FWIW, usando parse_known_argspiuttosto che parse_argsabilitare l'uso di ArgumentParserin code nell'ambito di if __name__ == 'main':(una condizione che è Trueper tutte le celle in un notebook IPython ... che trovo aiuta notevolmente lo sviluppo e il test del codice che voglio migrare alla fine in uno script invocato da una riga di comando)
gumption

1
Questo non sembra funzionare con argomenti facoltativi che sono "conosciuti" non trasmessi.
Sharud

21

È possibile inserire le parti rimanenti in un nuovo argomento con parser.add_argument('args', nargs=argparse.REMAINDER)se si desidera utilizzarle.


1
Funziona con parse_args()e non richiede parse_known_args()(su Python 2.7).
OozeMeister,

4
L'uso di argparse.REMAINDER sembra irto di bug di vecchia data. Certamente non riesco a farlo funzionare. parse_known_args () è una buona alternativa.
Matt,

1
Ho appena incontrato un bug REMAINDER di vecchia data
Scott Carpenter,

7

In realtà argparse continua a "ignorare" _unrecognized_args. Finché questi argomenti "non riconosciuti" non usano il prefisso predefinito, non si sentiranno lamentele dal parser.

Usando la configurazione di @ anutbu ma con lo standard parse.parse_args(), se dovessimo eseguire il nostro programma con i seguenti argomenti.

$ program --foo BAR a b +cd e

Avremo a disposizione questa raccolta di dati con spazio dei nomi.

Namespace(_unrecognized_args=['a', 'b', '+cd', 'e'], foo='BAR')

Se volessimo -ignorare il prefisso predefinito , potremmo cambiare ArgumentParser e decidere invece che useremo a +per i nostri argomenti "riconosciuti".

parser = argparse.ArgumentParser(prefix_chars='+')
parser.add_argument('+cd')

Lo stesso comando produrrà

Namespace(_unrecognized_args=['--foo', 'BAR', 'a', 'b'], cd='e')

Mettilo nella tua pipa e fumalo =)

nJoy!

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.