2012-10-10 6 views
114

Optparse, la vecchia versione ignora tutti gli argomenti non riconosciuti e prosegue. Nella maggior parte delle situazioni, questo non è l'ideale ed è stato cambiato in argparse. Ma ci sono alcune situazioni in cui si desidera ignorare qualsiasi argomento non riconosciuto e analizzare quelli che hai specificato.Python argparse ignora gli argomenti non riconosciuti

Ad 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?

+5

Molto utile se si sta scrivendo un wrapper su un altro programma e si desidera acquisire e modificare alcuni argomenti, ma passare il resto! –

+0

Esattamente perché sono finito qui @AlanDeSmet! Sono contento che non sto cercando di fare qualcosa di pazzo :) – dwanderson

risposta

212

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'] 
+9

+1 - non sapevo che c'era qualcosa come 'parse_known_args' – avasal

+2

Neanche io! L'ho persino perso nei documenti http://docs.python.org/library/argparse.html?highlight=argparse#partial-parsing. Grazie – jdborg

+1

Questo si è verificato quando si è tentato di utilizzare nosetest con parseargs (si è rifiutato di consentire l'uso di argomenti nosetest) il motivo era perché stavo facendo 'parser.parse_args (None)' piuttosto che parser.parse_args ([]) 'in i miei test –

5

realtà argparse non ancora "ignora" _unrecognized_args. Finché questi argomenti "non riconosciuti" non utilizzano il prefisso predefinito, non si sentiranno reclami dal parser.

Utilizzando 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 questa raccolta dati Namespaced con cui lavorare.

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

Se volessimo il prefisso predefinito - ignorato potremmo cambiare l'ArgumentParser e decidere ci accingiamo a utilizzare un + per i nostri argomenti "riconosciute", invece.

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

Lo stesso comando produrrà

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

Metti che nel vostro tubo e fumarla =)

nJoy!

14

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

+0

Funziona con 'parse_args()' e non richiede 'parse_known_args()' (su Python 2.7). – OozeMeister

+2

L'utilizzo di argparse.REMAINDER sembra pieno di bug di vecchia data. Di certo non riesco a farlo funzionare. parse_known_args() è una buona alternativa. – Matt

+0

Oggi si è imbattuto in un bug REMAINDER di vecchia data: https://bugs.python.org/issue17050 –

Problemi correlati