2012-10-10 6 views
114

Optparse, stara wersja po prostu ignoruje wszystkie nierozpoznane argumenty i kontynuuje. W większości sytuacji nie jest to idealne i zostało zmienione w argparse. Ale jest kilka sytuacji, w których chcesz zignorować wszelkie nierozpoznane argumenty i przeanalizować te, które określiłeś.Python argparse ignoruje nierozpoznane argumenty

Na przykład:

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

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

Czy mimo to nadpisać?

+5

Bardzo przydatny, jeśli piszesz wrapper do innego programu i chcesz uchwycić i zmodyfikować kilka argumentów, ale resztę przekazać! –

+0

Dokładnie dlatego trafiłem tutaj @AlanDeSmet! Cieszę się, że nie próbuję zrobić czegoś szalonego :) – dwanderson

Odpowiedz

212

Wymień

args = parser.parse_args() 

z

args, unknown = parser.parse_known_args() 

Na przykład,

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 - nie wiedziałem, że było coś takiego jak "parse_known_args' – avasal

+2

Ani ja! Brakowało mi nawet tego w dokumentach http://docs.python.org/library/argparse.html?highlight=argparse#partial-parsing. Dzięki – jdborg

+1

Wyszło to przy próbie użycia testu nosa z parseargs (odmówił użycia argumentów nosetest), ponieważ robiłem 'parser.parse_args (None)' zamiast 'parser.parse_args ([])' in moje testy. –

5

Właściwie argparse ma nadal "ignoruj" _unrecognized_args. Dopóki te "nierozpoznane" argumenty nie będą używać domyślnego prefiksu, nie usłyszysz żadnych skarg od analizatora składni.

Używanie konfiguracji @ anutbu, ale ze standardem parse.parse_args(), jeśli mamy wykonać nasz program z następującymi argumentami.

$ program --foo BAR a b +cd e 

Będziemy mieć do dyspozycji zbiór danych o Przestrzeni nazw.

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

Gdybyśmy chcieli domyślnego prefiksu - ignorowane moglibyśmy zmienić ArgumentParser i zdecydować, mamy zamiar użyć + dla naszych „uznane” zamiast argumentów.

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

Ta sama komenda będzie produkować

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

Put, że w rurze i pali go =)

NJOY!

14

Możesz wstawić pozostałe części do nowego argumentu za pomocą parser.add_argument('args', nargs=argparse.REMAINDER), jeśli chcesz z nich korzystać.

+0

Działa to z 'parse_args()' i nie wymaga 'parse_known_args()' (w Pythonie 2.7). – OozeMeister

+2

Użycie argparse.REMAINDER wydaje się być obarczone długotrwałymi błędami. Z pewnością nie mogę go uruchomić. parse_known_args() jest dobrą alternatywą. – Matt

+0

Właśnie wpadł na długi błąd REMAINDER dzisiaj: https://bugs.python.org/issue17050 –