Python argparse tanınmayan argümanları yoksay


206

Optparse, eski sürüm sadece tanınmayan tüm argümanları görmezden gelir ve devam eder. Çoğu durumda, bu ideal değildir ve argparse ile değiştirilmiştir. Ancak tanınmayan argümanları yok saymak ve belirttiğiniz argümanları ayrıştırmak istediğiniz birkaç durum vardır.

Örneğin:

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

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

Bunun üzerine yazmak için yine de var mı?


14
Başka bir programa bir sarıcı yazıyorsanız ve birkaç argümanı yakalamak ve değiştirmek istiyorsanız, ancak geri kalanını geçirin!
Alan De Smet

2
Tam olarak neden buraya @AlanDeSmet geldi! Sevindim deli bir şey yapmaya çalışmıyorum :)
dwanderson

Yanıtlar:


351

değiştirmek

args = parser.parse_args()

ile

args, unknown = parser.parse_known_args()

Örneğin,

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 - böyle bir şey olduğunu bilmiyordumparse_known_args
avasal

7
Ne yaptım! Hatta docs.python.org/library/… dokümanlarında bile kaçırdım . Teşekkürler
joedborg

1
Bu nosetest'i parseargs ile kullanmaya çalışırken ortaya çıktı (nosetest argümanlarının kullanılmasına izin vermeyi reddetti) nedeni testlerimden parser.parse_args(None)ziyade yapıyordum parser.parse_args([]).
Andy Hayden

3
FWIW, parse_known_argsyerine kod içinde parse_argskullanımını sağlar yerine ( bir IPython Notebook tüm hücreler için olan bir durum ... ki ben büyük ölçüde yardımcı olur sonunda sonunda çağrılan bir komut dosyasına geçirmek istiyorum geliştirme ve test kodu yardımcı olur komut satırından)ArgumentParserif __name__ == 'main':True
gumption

1
Bu, geçmediği bilinen "isteğe bağlı" argümanlar ile işe yaramıyor gibi görünüyor.
Sharud

21

Kullanmak isterseniz, kalan parçaları yeni bir bağımsız değişkene koyabilirsiniz parser.add_argument('args', nargs=argparse.REMAINDER).


1
Bu çalışır parse_args()ve gerektirmez parse_known_args()(Python 2.7'de).
OozeMeister

4
Argparse.REMAINDER kullanımı uzun süredir devam eden hatalarla doludur. Kesinlikle işe yarayamam. parse_known_args () iyi bir alternatiftir.
Matt

1
Bugün uzun süredir devam eden bir KALAN hataya rastladım
Scott Carpenter

7

Aslında argparse hala "görmezden gelir" _unrecognized_args. Bu "tanınmayan" argümanlar varsayılan öneki kullanmadığı sürece , ayrıştırıcıdan hiçbir şikayet duymazsınız.

@ Anutbu'nun yapılandırmasını kullanarak, ancak standartlarımızı kullanarak parse.parse_args(), programımızı aşağıdaki argümanlarla yürütürsek .

$ program --foo BAR a b +cd e

Çalışmak için bu Ad Aralığı veri koleksiyonuna sahip olacağız.

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

Varsayılan önekin -yoksayılmasını isteseydik, ArgumentParser'ı değiştirebilir ve +bunun yerine "tanınan" bağımsız değişkenlerimiz için a kullanacağımıza karar verebiliriz .

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

Aynı komut üretecek

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

Bunu piponuza koy ve sigara iç =)

Njoy!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.