The dokumentasi untuk modul python argparse , sementara sangat baik saya yakin, terlalu banyak untuk otak pemula kecil saya untuk memahami sekarang. Saya tidak perlu melakukan matematika di baris perintah atau campur tangan dengan memformat garis di layar atau mengubah karakter opsi. Yang ingin saya lakukan adalah "Jika arg adalah A, lakukan ini, jika B melakukan itu, jika tidak ada yang di atas menunjukkan bantuan dan berhenti" .
529
sys.argv
argumen yang Anda inginkan ...Jawaban:
Pemahaman saya tentang pertanyaan asli ada dua. Pertama, dalam hal contoh argparse yang paling sederhana, saya terkejut bahwa saya belum melihatnya di sini. Tentu saja, untuk menjadi sangat sederhana, itu semua di atas kepala dengan sedikit daya, tetapi itu mungkin bisa Anda mulai.
Tetapi argumen posisi ini sekarang diperlukan. Jika Anda membiarkannya ketika menjalankan program ini, Anda akan mendapatkan kesalahan tentang argumen yang hilang. Ini membawa saya ke bagian kedua dari pertanyaan awal. Matt Wilkie tampaknya menginginkan argumen opsional tunggal tanpa label bernama (label --option). Saran saya adalah memodifikasi kode di atas sebagai berikut:
Mungkin ada solusi yang lebih elegan, tetapi ini bekerja dan minimalis.
sumber
Inilah cara saya melakukannya
argparse
(dengan beberapa argumen):args
akan menjadi kamus yang berisi argumen:Dalam kasus Anda cukup tambahkan hanya satu argumen.
sumber
foo.py --action install
ataufoo.py --action remove
bukannya hanyafoo.py install
parser.add_argument('install', help='Install the app')
(Perhatikan Anda tidak dapat mendefinisikan argumen posisirequired=True
)args
dikt dibuat seperti di atas.args.foo
danargs.bar
bukannya sintaks kamus. Yang manapun tentu saja baik-baik saja, tetapi args sebenarnya bukan sebuah kamus tetapi sebuahargparse.Namespace
objek.The
argparse
dokumentasi cukup baik tapi daun keluar beberapa detail yang berguna yang mungkin tidak jelas. (@Diego Navarro sudah menyebutkan beberapa hal ini tetapi saya akan mencoba sedikit memperluas jawabannya.) Penggunaan dasar adalah sebagai berikut:Objek tempat Anda kembali
parse_args()
adalah objek 'Namespace': Objek yang variabel anggotanya dinamai menurut argumen baris perintah Anda. TheNamespace
objek adalah bagaimana Anda mengakses argumen Anda dan nilai-nilai yang terkait dengan mereka:(Catatan yang
argparse
menggantikan '-' dalam nama argumen Anda dengan garis bawah saat menamai variabel.)Dalam banyak situasi Anda mungkin ingin menggunakan argumen hanya sebagai flag yang tidak memiliki nilai. Anda dapat menambahkannya dalam argparse seperti ini:
Di atas akan membuat variabel bernama 'foo' dengan nilai True, dan 'no_foo' dengan nilai False, masing-masing:
Perhatikan juga bahwa Anda dapat menggunakan opsi "wajib" saat menambahkan argumen:
Dengan begitu, jika Anda menghilangkan argumen ini di baris perintah
argparse
akan memberi tahu Anda ada yang hilang dan menghentikan eksekusi skrip Anda.Akhirnya, perhatikan bahwa membuat struktur dict argumen Anda menggunakan
vars
fungsi, jika itu membuat hidup Anda lebih mudah.Seperti yang Anda lihat,
vars
mengembalikan dikt dengan nama argumen Anda sebagai kunci dan nilainya sebagai, eh, nilai.Ada banyak opsi dan hal lain yang dapat Anda lakukan, tetapi ini harus mencakup skenario penggunaan yang paling esensial dan umum.
sumber
'-f'
dan'-b'
? Mengapa Anda tidak bisa menghilangkan ini?man cp
atauman ls
dan Anda akan menemukan bahwa banyak pilihan datang dalam kedua rasa (misalnya-f, --force
). Mungkin ada berbagai alasan mengapa orang lebih suka satu atau yang lain, tetapi dalam hal apa pun itu cukup standar untuk membuat kedua bentuk tersedia di program Anda.Matt bertanya tentang parameter posisi dalam argparse, dan saya setuju bahwa dokumentasi Python kurang pada aspek ini. Tidak ada satu pun, contoh lengkap dalam ~ 20 halaman ganjil yang menunjukkan parsing dan menggunakan parameter posisi .
Tidak ada jawaban lain di sini yang menunjukkan contoh lengkap parameter posisi, jadi, inilah contoh lengkapnya:
Hal yang mengusir saya adalah bahwa argparse akan mengubah argumen bernama "--foo-bar" menjadi "foo_bar", tetapi parameter posisi bernama "foo-bar" tetap sebagai "foo-bar", membuatnya menjadi kurang jelas bagaimana cara gunakan dalam program Anda.
Perhatikan dua baris di dekat akhir contoh saya - tak satu pun dari mereka akan bekerja untuk mendapatkan nilai param posisi posisi foo-bar. Yang pertama jelas salah (ini adalah ekspresi aritmatika args.foo minus bar), tetapi yang kedua tidak berfungsi:
Jika Anda ingin menggunakan
foo-bar
atribut, Anda harus menggunakangetattr
, seperti yang terlihat pada baris terakhir dari contoh saya. Yang gila adalah bahwa jika Anda mencoba menggunakandest=foo_bar
untuk mengubah nama properti menjadi sesuatu yang lebih mudah diakses, Anda akan mendapatkan pesan kesalahan yang sangat aneh:Begini cara contoh di atas berjalan:
sumber
nargs='?'
adalah mantra untuk "posisi opsional" sesuai stackoverflow.com/questions/4480075/...foo-bar
tidak ditransformasikan kefoo_bar
dibahas dalam bugs.python.org/issue15125 .print args.foo_bar
bekerja. Karena ini adalah argumen posisi Anda tidak perlu menentukan nama saat memanggil skrip, sehingga tidak masalah bagi pengguna.getattr
(itu juga lebih fleksibel karena memungkinkan Anda untuk mengubah argumen dari opsional ke posisi tanpa harus mengubah kode yang menggunakan nilai).Pengantar ringkasan lain, terinspirasi oleh posting ini .
Argumen didefinisikan dengan kombinasi dari yang berikut:
Pilihan umum adalah:
--help
digunakan.float
atauint
(sebaliknyastr
).'-x', '--long-name', dest='longName'
.).Catatan: secara default
--long-name
diakses denganargs.long_name
store_true, store_false
: untuk boolean args'--foo', action='store_true' => args.foo == True
store_const
: untuk digunakan dengan opsiconst
'--foo', action='store_const', const=42 => args.foo == 42
count
: untuk opsi berulang, seperti pada./myscript.py -vv
'-v', action='count' => args.v == 2
append
: untuk opsi berulang, seperti pada./myscript.py --foo 1 --foo 2
'--foo', action='append' => args.foo == ['1', '2']
./myscript.py --foo a b => args.foo = ['a', 'b']
type=int
).sumber
Perhatikan Tutorial Argparse dalam Python HOWTOs . Dimulai dari sebagian besar contoh dasar, seperti ini:
dan berkembang menjadi yang kurang mendasar.
Ada contoh dengan pilihan yang sudah ditentukan sebelumnya untuk suatu opsi, seperti apa yang ditanyakan:
sumber
Inilah yang saya hasilkan dalam proyek pembelajaran saya terutama berkat @DMH ...
Kode demo:
Ini mungkin telah berkembang dan tersedia online: command-line.py
Script untuk memberikan kode ini latihan: command-line-demo.sh
sumber
Anda juga bisa menggunakan plac (pembungkus
argparse
).Sebagai bonus, ini menghasilkan instruksi bantuan yang rapi - lihat di bawah.
Skrip contoh:
Contoh output:
Tidak ada argumen yang diberikan -
example.py
:Argumen yang tidak terduga disediakan -
example.py C
:Argumen yang benar disertakan -
example.py A
:Menu bantuan penuh (dihasilkan secara otomatis) -
example.py -h
:Penjelasan singkat:
Nama argumen biasanya sama dengan nama parameter (
arg
).Anotasi tuple setelah
arg
parameter memiliki arti sebagai berikut:Argument with two possible values
)positional
)None
)None
)['A', 'B']
)Dokumentasi:
Untuk mempelajari lebih lanjut tentang cara menggunakan plac, lihat dokumentasinya yang luar biasa:
sumber
Untuk menambah apa yang dikatakan orang lain:
Saya biasanya suka menggunakan parameter 'dest' untuk menentukan nama variabel dan kemudian menggunakan 'global () .perbarui ()' untuk meletakkan variabel-variabel tersebut di namespace global.
Pemakaian:
Kode:
sumber
argparse
Menggunakangetattr
dansetattr
mengakses nilai di Namespace secara internal . Dengan begitu tidak terganggu olehdest
nilai-nilai yang terbentuk secara aneh .Cara yang sangat sederhana untuk menggunakan argparse dan mengubah switch '-h' / '--help' untuk menampilkan instruksi bantuan kode pribadi Anda adalah dengan mengatur bantuan default ke False, Anda juga dapat menambahkan sebanyak mungkin .add_arguments tambahan yang Anda inginkan :
Jalankan: python test.py -h
Keluaran:
sumber
Jawaban paling sederhana!
PS orang yang menulis dokumen argparse itu bodoh
kode python:
menjalankan kode
sumber