Gereksinimlerin İncelenmesi
- kullan
argparse
(bunu görmezden geleceğim)
- bir veya iki eylemin çağrılmasına izin verin (en az bir tane gereklidir).
- Pythonic ile deneyin ("POSIX" benzeri demeyi tercih ederim)
Komut satırında yaşarken bazı örtük gereksinimler de vardır:
- Kullanıcıya kullanımı kolay anlaşılır bir şekilde açıklayın
- seçenekler isteğe bağlı olacaktır
- bayrakların ve seçeneklerin belirlenmesine izin ver
- diğer parametrelerle (dosya adı veya adları gibi) birleştirmeye izin verin.
docopt
(File managelog.py
) kullanarak örnek çözüm :
"""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
Çalıştırmayı deneyin:
$ python managelog.py
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Yardımı göster:
$ 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>
Ve onu kullanın:
$ 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}
Kısa alternatif short.py
Daha da kısa varyantlar olabilir:
"""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
Kullanım şuna benzer:
$ 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}
"İşlem" ve "yükleme" anahtarları için boole değerleri yerine sayaçların bulunduğunu unutmayın.
Görünüşe göre bu kelimelerin tekrarlanmasını önleyemeyiz:
$ 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}
Sonuçlar
İyi bir komut satırı arayüzü tasarlamak bazen zor olabilir.
Komut satırı tabanlı programın birçok yönü vardır:
- iyi komut satırı tasarımı
- uygun ayrıştırıcıyı seçme / kullanma
argparse
çok şey sunar, ancak olası senaryoları kısıtlar ve çok karmaşık hale gelebilir.
İle docopt
okunabilirliği korumak ve esneklik yüksek derecede sunarken işler çok daha kısa gidin. Sözlükten ayrıştırılmış argümanlar almayı yönetirseniz ve bazı dönüşümleri (tamsayıya, dosyaları açmaya ..) elle (veya başka bir kitaplık ile schema
) yaparsanız, docopt
komut satırı ayrıştırması için uygun bulabilirsiniz .
-x
evrensel olarak bir bayraktır ve isteğe bağlıdır.-
Gerekirse kesin .