Argparse - पार्स तर्क और आसानी के साथ कमांड लाइन विकल्प

पायथन 2.7 के साथ शुरू, कमांड लाइन तर्क (मापदंडों, कुंजियों) को संभालने के लिए मानक लाइब्रेरी के सेट में अर्गपर्स लाइब्रेरी को शामिल किया गया है। मैं आपका ध्यान इस पर रोकना चाहूंगा।

आरंभ करने के लिए, इस बात पर विचार करें कि अर्गपर्स को क्या पेशकश करनी है।

Argparse एक सुरुचिपूर्ण उपकरण है:


पायथन में अर्ग्पैरस को शामिल करने के विरोधियों के तर्कों में से एक तर्क था कि मानक मॉड्यूल यहां तक ​​कि कमांड लाइन मापदंडों के शब्दार्थ प्रसंस्करण (पार्सिंग) के लिए दो पुस्तकालय होते हैं। हालाँकि, argparse डेवलपर्स का दावा है कि कई कारणों से गेटअप और ऑप्टपर्स argparse से हीन हैं:


अर्गपर्स के साथ काम करना शुरू करने के लिए, आपको एक पार्सर निर्दिष्ट करना होगा:

ap.py: import argparse parser = argparse.ArgumentParser(description='Great Description To Be Here') 


इसके अलावा, पार्सर को इंगित करना चाहिए कि आप किन वस्तुओं से इसकी उम्मीद करते हैं। किसी विशेष मामले में, ऐसा लग सकता है:

 parser.add_argument('-n', action='store', dest='n', help='Simple value') 


यदि इस तर्क के लिए कोई कार्रवाई निर्दिष्ट नहीं है, तो डिफ़ॉल्ट रूप से इसे नेमस्पेस में संग्रहीत (स्टोर) किया जाएगा, और हम इस तर्क के प्रकार (इंट, बूलियन, आदि) को भी निर्दिष्ट कर सकते हैं। यदि वापसी तर्क (भाग्य) का नाम निर्दिष्ट किया गया है, तो इसका मान संबंधित नामस्थान विशेषता में संग्रहीत किया जाएगा।

हमारे मामले में:
 print parser.parse_args(['-n', '3']) Namespace(n='3') print parser.parse_args([]) Namespace(n=None) print parser.parse_args(['-a', '3']) error: unrecognized arguments: -a 3 


वैकल्पिक तर्क (-v) के आधार पर एक स्थितीय तर्क (वर्ग) के मान को उत्पन्न करने और आउटपुट उत्पन्न करने वाले कार्यक्रम का एक सरल उदाहरण:

 import argparse parser = argparse.ArgumentParser() parser.add_argument("square", type=int, help="display a square of a given number") parser.add_argument("-v", "--verbose", action="store_true", help="increase output verbosity") args = parser.parse_args() answer = args.square**2 if args.verbose: print("the square of {} equals {}".format(args.square, answer)) else: print(answer) 


हमें कर्मों पर ध्यान देना चाहिए। वे इस प्रकार हो सकते हैं:
- स्टोर: नेमस्पेस (एक वैकल्पिक प्रकार के बाद) में एक मान लौटाता है। जैसा कि पहले ही उल्लेख किया गया है, स्टोर डिफ़ॉल्ट क्रिया है;

- store_const: मुख्य रूप से झंडे के लिए उपयोग किया जाता है। यह या तो const में निर्दिष्ट मान लौटाएगा, या (यदि कुछ भी निर्दिष्ट नहीं है), कोई नहीं। एक उदाहरण:

 parser.add_argument('--LifetheUniverseandEverything', action='store_const', const=42) print parser.parse_args(['--LifetheUniverseandEverything']) Namespace(LifetheUniverseandEverything=42) 


- store_true / store_false: store_const का एनालॉग, लेकिन बूलियन ट्रू और गलत के लिए;

- परिशिष्ट: इसमें तर्क मान जोड़कर एक सूची लौटाता है। एक उदाहरण:
 parser.add_argument('--l', action='append') print parser.parse_args('--la --lb --l Y'.split()) Namespace(l=['abY']) 


- append_const: सूची में तर्क विनिर्देश में निर्दिष्ट मान लौटाएं । अभी तक मेरे पास ऐसा मामला नहीं है जिसमें अपेंडेंट_कॉन्स्ट की जरूरत होगी।

- गिनती: जैसा कि नाम से ही स्पष्ट है कि इस तर्क का मूल्य कितनी बार आता है। एक उदाहरण:

 parser.add_argument('--verbose', '-v', action='count') print parser.parse_args('-vvv'.split()) Namespace(verbose=3) 


Parser के कंस्ट्रक्टर में दिए गए तर्क add_help (बूलियन प्रकार) के आधार पर, यह निर्धारित किया जाएगा कि कुंजियों द्वारा मानक आउटपुट में संदेशों को शामिल किया जाए या नहीं ['-h', '--help']। तर्क संस्करण (स्ट्रिंग प्रकार) के साथ भी ऐसा ही होगा, डिफ़ॉल्ट कुंजी हैं: ['-v', '--version']। मदद या संस्करण संख्या का अनुरोध करते समय, आगे निष्पादन बाधित होता है।

 parser = argparse.ArgumentParser(add_help=True, version='4.0') 


कभी-कभी कमांड लाइन मापदंडों के एक निश्चित सेट को परिभाषित करना आवश्यक होता है जो आपके प्रोग्राम के सभी पार्सर्स पर लागू होगा। इस मामले में, वे अक्सर प्राधिकरण की आवश्यकता का एक उदाहरण देते हैं:

 parent_parser = argparse.ArgumentParser(add_help=False) parent_parser.add_argument('--user', action="store") parent_parser.add_argument('--password', action="store") child_parser = argparse.ArgumentParser(parents=[parent_parser]) child_parser.add_argument('--show_all', action="store_true") print child_parser.parse_args(['--user', 'guest']) Namespace(password=None, show_all=False, user='guest') 


ध्यान दें कि पैरेंट पार्सर add_help = गलत पैरामीटर के साथ बनाया गया है। ऐसा इसलिए है क्योंकि प्रत्येक पार्सर ईमानदारी से अपने स्वयं के '-h' कुंजी हैंडलर को जोड़ने का प्रयास करेगा, जो संघर्ष की स्थिति पैदा करेगा। यह इस सवाल का जवाब देता है कि क्या करें यदि आपके बच्चे के पार्सर में माता-पिता के समान चाबियां हैं और आप उन्हें बिना किसी संघर्ष के उपयोग करना चाहते हैं? यह केवल तर्क परस्पर विरोधी_हैंडलर को जोड़कर किया जाता है:

 parent_parser = argparse.ArgumentParser(add_help=False) parent_parser.add_argument('--user', action="store") parent_parser.add_argument('--password', action="store") child_parser = argparse.ArgumentParser(parents=[parent_parser], conflict_handler='resolve') child_parser.add_argument('--user', action="store", default="Guest") print child_parser.parse_args() Namespace(password=None, user='Guest') 


विभिन्न स्तरों पर प्रसंस्करण आदेशों के लिए उपरोक्त दृष्टिकोण के अलावा, एक वैकल्पिक दृष्टिकोण भी है जो आपको सबपरर्स का उपयोग करके एक प्रोग्राम में सभी कमांड के प्रसंस्करण को संयोजित करने की अनुमति देता है। एक उदाहरण खुद के लिए सबसे अच्छा बताएगा:

 ap.py import argparse parser = argparse.ArgumentParser() subparsers = parser.add_subparsers(help='List of commands') # A list command list_parser = subparsers.add_parser('list', help='List contents') list_parser.add_argument('dirname', action='store', help='Directory to list') # A create command create_parser = subparsers.add_parser('create', help='Create a directory') create_parser.add_argument('dirname', action='store', help='New directory to create') create_parser.add_argument('--read-only', default=False, action='store_true', help='Set permissions to prevent writing to the directory', ) 


यह '-h' विकल्प के साथ कार्यक्रम का उत्पादन करेगा:

usage: ap.py [-h] {list,create} ...

positional arguments:
{list,create} list of commands
list List contents
create Create a directory

optional arguments:
-h, --help show this help message and exit


उदाहरण में निम्नलिखित बातों पर ध्यान दिया जा सकता है:
1. स्थिति संबंधी तर्क सूची, कार्यक्रम के लिए बनाया गया, पारित किया गया - अनिवार्य रूप से सबपर्सर्स;
2. तर्क `- केवल-केवल 'सबपर के create_parser - वैकल्पिक , dir_name - दोनों subparsers के लिए आवश्यक;
3. मदद (मदद) पार्सर और प्रत्येक उप-पार्सर के लिए दोनों प्रदान की जाती है।

सामान्य तौर पर, argparse एक काफी शक्तिशाली और हल्का पुस्तकालय है, जो मेरी राय में, कमांड लाइन मापदंडों के साथ काम करने के लिए बहुत सुविधाजनक इंटरफ़ेस प्रदान करता है। अगली बार मैं फ़ाइल तर्क (फ़ाइलों के साथ अधिक उन्नत कार्य के लिए), चर तर्क सूची, तर्कों के समूह और टाइपिंग तर्कों की अधिक विस्तृत चर्चा जैसे मुद्दों को कवर करने का प्रयास करूँगा।
आपका ध्यान देने के लिए धन्यवाद।

संदर्भ:
अडॉप्ट और ऑप्टपर्स पर्याप्त क्यों नहीं हैं (PEP 389)
तर्कपूर्ण स्थिति और वैकल्पिक तर्क
अर्गपर्स डॉक्यूमेंटेशन
कमांड-लाइन विकल्प, तर्क और उप-कमांड के लिए पार्सर

Source: https://habr.com/ru/post/In144416/


All Articles