Bağımsız değişkenler olmadan Python argparse komut satırı bayrakları


345

Komut satırı argümanlarıma nasıl isteğe bağlı bir bayrak eklerim?

Örneğin. böylece yazabilirim

python myprog.py 

veya

python myprog.py -w

denedim

parser.add_argument('-w')

Ama sadece bir hata mesajı alıyorum

Usage [-w W]
error: argument -w: expected one argument

ki bunu -w seçeneği için bir argüman değeri istediği anlamına gelir. Bir bayrağı kabul etmenin yolu nedir?

Bu soruda http://docs.python.org/library/argparse.html oldukça opak buluyorum .


4
Senaryonuza sadece 1 bayrak istiyorsanız, sys.argv çok daha kolay olurdu. Özellikle argparse öğrenmeye çalışmadığınız sürece, bu iyidir çünkü kullanışlı bir modül.
chown

2
Şimdi cevabı öğrendikten sonra bile bunu dokümantasyondan nasıl anlayabileceğimi göremiyorum.
Andreas Haferburg

Yanıtlar:


533

Sizde olduğu gibi, w argümanı komut satırında -w'den sonra bir değer bekliyor. Eğer sadece bir değişkeni ayarlayarak bir geçiş çevirmek arıyorsanız Trueya False, bir göz http://docs.python.org/dev/library/argparse.html#action (özellikle store_true ve store_false)

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-w', action='store_true')

nerede action='store_true'ima default=False.

Tersine, sahip olabilirsiniz action='store_false', bu da ima eder default=True.


3
@Jdog, Bunun benim için neden işe yaramadığına dair bir fikrin var mı? Her wzaman False.
Iulian Onofrei

52

Yürütülmeye hazır olması için hızlı bir snippet ekleme:

Kaynak: myparser.py

import argparse
parser = argparse.ArgumentParser(description="Flip a switch by setting a flag")
parser.add_argument('-w', action='store_true')

args = parser.parse_args()
print args.w

Kullanımı:

python myparser.py -w
>> True

-10

İşte bunu yapmanın hızlı bir yolu, ayrıca hiçbir şey gerektirmez sys.. işlevsellik sınırlıdır:

flag = "--flag" in sys.argv[1:]

[1:] dosya adının tam olması durumunda --flag


13
Sadece bu uzun vadede nasıl bir fikir BAD ifade etmek için giriş yaptı. "--Flag" dizesinin sys.argv içinde olup olmadığını kontrol ederek başladığınızı düşünün. Ardından hangi dosyanın açılacağını görmek için sys.argv [-1] sonuna bakabilirsiniz. Birdenbire --flag, adında bir dosyayı açmaya çalışırsanız , beklenmedik bir şekilde davranacak ve daha da kötüsü, bunun genellikle güvenilmeyen verilerin sona erdiği zaman yolda bir güvenlik açığı haline geldiği bir durumla sonuçlanırsınız. argv'ye geçti. Sonunda, bu yöntem yapılmamalıdır. Gerçek arg ayrıştırıcılar çok daha sağlam ...
timthelion

3
Belirtildiği gibi, bu çözüm hiç sağlam değildir, ancak bunun çok hızlı bir şekilde yapılması gerekiyorsa işe yarar (örneğin test amaçlı). Kesinlikle üretim kodundan uzak tutun.
Jonathan Sudiaman
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.