आवश्यकताएँ समीक्षा
- उपयोग
argparse
(मैं इसे अनदेखा करूँगा)
- एक या दो क्रियाओं को करने की अनुमति दें (कम से कम एक आवश्यक)।
- पाइथोनिक द्वारा प्रयास करें (मैं इसे "POSIX"-समान कहना चाहूंगा)
कमांड लाइन पर रहने पर कुछ निहित आवश्यकताएं भी हैं:
- उपयोगकर्ता के उपयोग को इस तरह से समझाएं जो समझने में आसान हो
- विकल्प वैकल्पिक होंगे
- झंडे और विकल्पों को निर्दिष्ट करने की अनुमति दें
- अन्य मापदंडों (जैसे फ़ाइल नाम या नाम) के साथ संयोजन की अनुमति दें।
नमूना समाधान का उपयोग कर docopt
(फ़ाइल 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
इसे चलाने का प्रयास करें:
$ python managelog.py
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
मदद दिखाएँ:
$ 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>
और इसका उपयोग करें:
$ 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}
संक्षिप्त विकल्प short.py
और भी छोटे संस्करण हो सकते हैं:
"""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
उपयोग इस तरह दिखता है:
$ 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}
ध्यान दें, कि "प्रक्रिया" और "अपलोड" कुंजी के लिए बूलियन मानों के बजाय काउंटर हैं।
यह पता चला है, हम इन शब्दों के दोहराव को नहीं रोक सकते:
$ 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}
निष्कर्ष
अच्छा कमांड लाइन इंटरफ़ेस डिजाइन करना कुछ समय के लिए चुनौतीपूर्ण हो सकता है।
कमांड लाइन आधारित कार्यक्रम के कई पहलू हैं:
- कमांड लाइन का अच्छा डिजाइन
- उचित पार्सर का चयन / उपयोग करना
argparse
बहुत कुछ प्रदान करता है, लेकिन संभव परिदृश्यों को प्रतिबंधित करता है और बहुत जटिल बन सकता है।
साथ docopt
बातें बहुत कम है, जबकि पठनीयता संरक्षण और लचीलेपन के उच्च स्तर की पेशकश जाना। यदि आप शब्दकोश से पार्स किए गए तर्क प्राप्त कर रहे हैं और कुछ रूपांतरण (पूर्णांक, खोलने वाली फाइलें ..) मैन्युअल रूप से (या अन्य पुस्तकालय नाम से schema
) करते हैं, तो आप docopt
कमांड लाइन पार्सिंग के लिए उपयुक्त हो सकते हैं ।
-x
सार्वभौमिक रूप से एक ध्वज और वैकल्पिक है।-
यदि आवश्यक हो तो काटें ।