Tinjauan Persyaratan
- gunakan
argparse
(saya akan mengabaikan yang ini)
- memungkinkan satu atau dua tindakan dipanggil (setidaknya satu diperlukan).
- coba dengan Pythonic (saya lebih suka menyebutnya "POSIX" -like)
Ada juga beberapa persyaratan implisit saat menggunakan command line:
- menjelaskan penggunaan kepada pengguna dengan cara yang mudah dimengerti
- opsi harus opsional
- Izinkan menentukan bendera dan opsi
- memungkinkan penggabungan dengan parameter lain (seperti nama file atau nama).
Solusi sampel menggunakan docopt
(file managelog.py
):
"""Manage logfiles
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> Password
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
"""
if __name__ == "__main__":
from docopt import docopt
args = docopt(__doc__)
print args
Coba jalankan:
$ python managelog.py
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Tunjukkan bantuan:
$ python managelog.py -h
Manage logfiles
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> P managelog.py [options] upload -- <logfile>...
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
Dan gunakan itu:
$ python managelog.py -V -U user -P secret upload -- alfa.log beta.log
{'--': True,
'--pswd': 'secret',
'--user': 'user',
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': False,
'upload': True}
Alternatif pendek short.py
Mungkin ada varian yang lebih pendek:
"""Manage logfiles
Usage:
short.py [options] (process|upload)... -- <logfile>...
short.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> Password
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
"""
if __name__ == "__main__":
from docopt import docopt
args = docopt(__doc__)
print args
Penggunaannya terlihat seperti ini:
$ python short.py -V process upload -- alfa.log beta.log
{'--': True,
'--pswd': None,
'--user': None,
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': 1,
'upload': 1}
Perhatikan, sebagai ganti nilai boolean untuk kunci "proses" dan "unggah" yang ada adalah penghitung.
Ternyata, kami tidak dapat mencegah duplikasi kata-kata ini:
$ python short.py -V process process upload -- alfa.log beta.log
{'--': True,
'--pswd': None,
'--user': None,
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': 2,
'upload': 1}
Kesimpulan
Mendesain antarmuka baris perintah yang baik terkadang menjadi tantangan.
Ada beberapa aspek program berbasis baris perintah:
- desain baris perintah yang bagus
- memilih / menggunakan parser yang tepat
argparse
menawarkan banyak hal, tetapi membatasi kemungkinan skenario dan bisa menjadi sangat kompleks.
Dengan docopt
segala sesuatunya menjadi lebih pendek sambil mempertahankan keterbacaan dan menawarkan tingkat fleksibilitas yang tinggi. Jika Anda mengelola mendapatkan argumen parsing dari kamus dan melakukan beberapa konversi (ke integer, membuka file ..) secara manual (atau dengan pustaka lain yang disebut schema
), Anda mungkin merasa docopt
cocok untuk penguraian baris perintah.
-x
secara universal adalah sebuah bendera dan opsional. Potong-
jika diperlukan.