Python argparse flag baris perintah tanpa argumen

345

Bagaimana cara menambahkan flag opsional ke args baris perintah saya?

misalnya. jadi saya bisa menulis

python myprog.py 

atau

python myprog.py -w

Saya mencoba

parser.add_argument('-w')

Tapi saya hanya mendapatkan pesan kesalahan yang mengatakan

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

yang saya ambil itu berarti bahwa ia menginginkan nilai argumen untuk opsi -w. Apa cara hanya menerima bendera?

Saya menemukan http://docs.python.org/library/argparse.html agak buram tentang pertanyaan ini.

interstar
sumber
4
Jika Anda hanya ingin 1 flag ke skrip Anda, sys.argv akan jauh lebih mudah. Kecuali Anda secara khusus mencoba mempelajari argparse, yang bagus karena modulnya mudah diketahui.
chown
2
Bahkan setelah saya tahu jawabannya sekarang saya tidak melihat bagaimana saya bisa memahaminya dari dokumentasi.
Andreas Haferburg

Jawaban:

531

Seperti yang Anda miliki, argumen w mengharapkan nilai setelah -w pada baris perintah. Jika Anda hanya ingin membalik sakelar dengan menyetel variabel Trueatau False, lihat http://docs.python.org/dev/library/argparse.html#action (khusus store_true dan store_false)

import argparse

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

dimana action='store_true'tersirat default=False.

Sebaliknya, Anda bisa memiliki action='store_false', yang menyiratkan default=True.

Jdog
sumber
3
@ Josh, Tahu mengapa ini tidak berhasil untuk saya? Itu wselalu False.
Iulian Onofrei
52

Menambahkan potongan cepat agar siap dijalankan:

Sumber: 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

Pemakaian:

python myparser.py -w
>> True
pengguna1767754
sumber
-10

Berikut cara cepat untuk melakukannya, tidak akan memerlukan apa pun selain sys.. meskipun fungsionalitas terbatas:

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

[1:] dalam kasus jika nama file lengkapnya adalah --flag

dbalagula23
sumber
13
Hanya login hanya untuk mengekspresikan bagaimana BAD ide ini dalam jangka panjang. Bayangkan Anda memulai dengan memeriksa apakah string "--flag" ada di sys.argv. Kemudian Anda melihat bagian akhir sys.argv [-1] untuk melihat file mana yang dibuka. Tiba-tiba Anda berakhir dengan situasi di mana jika Anda mencoba untuk membuka file bernama --flag, maka itu akan berperilaku tak terduga, dan yang lebih buruk, adalah bahwa ini sering berakhir dengan cacat keamanan di jalan, ketika data yang tidak dipercaya berakhir menjadi diteruskan ke argv. Pada akhirnya, metode ini tidak seharusnya dilakukan. Pars parser nyata jauh lebih kuat ...
timthelion
3
Seperti yang disebutkan, solusi ini tidak kuat sama sekali, tetapi berfungsi jika Anda perlu ini dilakukan dengan sangat cepat (misalnya untuk tujuan pengujian). Pasti jauhkan dari kode produksi.
Jonathan Sudiaman