Python 3.7 - shlex

श्लेक्स - सरल शाब्दिक विश्लेषण




python

श्लेक्स - सरल शाब्दिक विश्लेषण

स्रोत कोड: Lib/shlex.py

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

shlex मॉड्यूल निम्नलिखित कार्यों को परिभाषित करता है:

shlex.split(s, comments=False, posix=True)

शेल-जैसे सिंटैक्स का उपयोग करके स्ट्रिंग को विभाजित करें। यदि टिप्पणियां False (डिफ़ॉल्ट), दिए गए स्ट्रिंग में टिप्पणियों के पार्सिंग को अक्षम कर दिया जाएगा (खाली स्ट्रिंग के लिए shlex उदाहरण की commenters विशेषता सेट करना)। यह फ़ंक्शन डिफ़ॉल्ट रूप से POSIX मोड में काम करता है, लेकिन पॉज़िक्स तर्क गलत होने पर गैर-POSIX मोड का उपयोग करता है।

ध्यान दें

चूंकि split() फ़ंक्शन एक shlex , एस के लिए None पास होने से मानक इनपुट से विभाजित करने के लिए स्ट्रिंग None पढ़ेगा।

shlex.quote(s)

स्ट्रिंग s के शेल-एस्केप संस्करण को लौटाएं। लौटाया गया मान एक स्ट्रिंग है जिसे शेल कमांड लाइन में एक टोकन के रूप में सुरक्षित रूप से उपयोग किया जा सकता है, ऐसे मामलों के लिए जहां आप सूची का उपयोग नहीं कर सकते हैं।

यह मुहावरा असुरक्षित होगा:

>>> filename = 'somefile; rm -rf ~'
>>> command = 'ls -l {}'.format(filename)
>>> print(command)  # executed by a shell: boom!
ls -l somefile; rm -rf ~

quote() आपको सुरक्षा छेद को प्लग करने देता है:

>>> from shlex import quote
>>> command = 'ls -l {}'.format(quote(filename))
>>> print(command)
ls -l 'somefile; rm -rf ~'
>>> remote_command = 'ssh home {}'.format(quote(command))
>>> print(remote_command)
ssh home 'ls -l '"'"'somefile; rm -rf ~'"'"''

उद्धरण UNIX गोले के साथ और split() साथ संगत है split() :

>>> from shlex import split
>>> remote_command = split(remote_command)
>>> remote_command
['ssh', 'home', "ls -l 'somefile; rm -rf ~'"]
>>> command = split(remote_command[-1])
>>> command
['ls', '-l', 'somefile; rm -rf ~']

संस्करण 3.3 में नया।

shlex मॉड्यूल निम्न वर्ग को परिभाषित करता है:

class shlex.shlex(instream=None, infile=None, posix=False, punctuation_chars=False)

एक shlex उदाहरण या उपवर्ग उदाहरण एक लेक्सिकल विश्लेषक ऑब्जेक्ट है। आरम्भिक तर्क, यदि मौजूद है, तो निर्दिष्ट करता है कि पात्रों को कहां से पढ़ना है। यह read() और readline() विधियों, या एक स्ट्रिंग के साथ एक फाइल- / स्ट्रीम-स्ट्रीम ऑब्जेक्ट होना चाहिए। यदि कोई तर्क नहीं दिया जाता है, तो इनपुट sys.stdin से लिया जाएगा। दूसरा वैकल्पिक तर्क एक फ़ाइल नाम स्ट्रिंग है, जो infile विशेषता के प्रारंभिक मूल्य को निर्धारित करता है। यदि sys.stdin तर्क को छोड़ दिया गया है या sys.stdin बराबर है, तो यह दूसरा तर्क " sys.stdin " को डिफॉल्ट करता है। पॉज़िक्स तर्क परिचालन मोड को परिभाषित करता है: जब shlex सही (डिफ़ॉल्ट) नहीं होता है, तो shlex आवृत्ति संगतता मोड में काम करेगी। POSIX मोड में काम करते समय, shlex POSIX शेल पार्सिंग नियमों के जितना संभव हो सके उतना करीब होने की कोशिश करेगा। विराम चिह्न_चर्चा तर्क व्यवहार को और भी वास्तविक बनाने का एक तरीका प्रदान करता है कि कैसे वास्तविक गोले को पार्स करें। यह कई मान ले सकता है: डिफ़ॉल्ट मान, False , पायथन 3.5 और उसके पहले देखे गए व्यवहार को संरक्षित रखता है। यदि इसे True सेट किया जाता है, तो वर्णों का पार्सिंग ();<>|& बदल जाता है: इन वर्णों का कोई भी भाग (विराम चिह्न वर्ण माना जाता है) एकल टोकन के रूप में वापस आ जाता है। यदि वर्णों के गैर-रिक्त स्ट्रिंग पर सेट किया जाता है, तो उन वर्णों को विराम चिह्न वर्णों के रूप में उपयोग किया जाएगा। wordchars विशेषता में कोई भी अक्षर जो विराम चिह्नों में प्रकट होता है, wordchars से हटा दिया जाएगा। अधिक जानकारी के लिए गोले के साथ बेहतर संगतता देखें।

संस्करण 3.6 में बदला: विराम चिह्न_चर्स पैरामीटर जोड़ा गया था।

यह भी देखें

Module configparser
Windows .ini फ़ाइलों के समान कॉन्फ़िगरेशन फ़ाइलों के लिए पार्सर।

shlex वस्तुओं

एक shlex उदाहरण के निम्नलिखित तरीके हैं:

shlex.get_token()

एक टोकन लौटाएं। यदि टोकन push_token() का उपयोग करके स्टैक किए गए हैं, तो स्टैक से एक टोकन पॉप करें। अन्यथा, इनपुट स्ट्रीम से एक को पढ़ें। यदि रीडिंग एक तत्काल एंड-ऑफ-फ़ाइल का सामना करती है, तो eof वापस आ जाता है (नॉन-पॉसिक्स मोड में खाली स्ट्रिंग ( '' ), और पॉसिक्स मोड में None )।

shlex.push_token(str)

टोकन स्टैक पर तर्क पुश करें।

shlex.read_token()

एक कच्चा टोकन पढ़ें। पुशबैक स्टैक को अनदेखा करें, और स्रोत अनुरोधों की व्याख्या न करें। (यह आमतौर पर एक उपयोगी प्रविष्टि बिंदु नहीं है, और केवल पूर्णता के लिए यहां प्रलेखित है।)

shlex.sourcehook(filename)

जब shlex एक स्रोत अनुरोध (नीचे source देखें) का पता लगाता है, तो इस विधि को तर्क के रूप में निम्नलिखित टोकन दिया जाता है, और एक फ़ाइल नाम और एक खुली फ़ाइल जैसी ऑब्जेक्ट से मिलकर एक ट्यूपल को वापस करने की उम्मीद की जाती है।

आम तौर पर, यह विधि पहले किसी भी उद्धरण को तर्क से अलग कर देती है। यदि परिणाम एक पूर्ण पथनाम है, या प्रभाव में कोई पिछला स्रोत अनुरोध नहीं था, या पिछला स्रोत एक स्ट्रीम (जैसे sys.stdin ) था, तो परिणाम अकेला छोड़ दिया गया है। अन्यथा, यदि परिणाम एक सापेक्ष पथनाम है, तो स्रोत समावेशन स्टैक पर इसके तुरंत पहले फ़ाइल के नाम का निर्देशिका भाग पूर्व निर्धारित है (यह व्यवहार उस तरह है जैसे C प्रीप्रोसेसर #include "file.h" संभालता है)।

जोड़तोड़ के परिणाम को एक फ़ाइलनाम के रूप में माना जाता है, और टपल के पहले घटक के रूप में लौटा, open() साथ इसे दूसरे घटक का उत्पादन करने के लिए कहा जाता है। (नोट: यह उदाहरण आरंभीकरण में तर्कों के क्रम का उल्टा है!)

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

स्रोत स्टैकिंग के अधिक स्पष्ट नियंत्रण के लिए, push_source() और pop_source() विधियों का उपयोग करें।

shlex.push_source(newstream, newfile=None)

इनपुट स्टैक पर एक इनपुट स्रोत स्ट्रीम पुश करें। यदि फ़ाइल नाम तर्क निर्दिष्ट किया गया है तो यह बाद में त्रुटि संदेशों में उपयोग के लिए उपलब्ध होगा। यह वही विधि है जिसका उपयोग आंतरिक रूप से sourcehook() विधि द्वारा किया जाता है।

shlex.pop_source()

इनपुट स्टैक से अंतिम-पुश किए गए इनपुट स्रोत को पॉप करें। यह वही तरीका है जो आंतरिक रूप से उपयोग किया जाता है जब लेक्सर स्टैक्ड इनपुट स्ट्रीम पर ईओएफ तक पहुंचता है।

shlex.error_leader(infile=None, lineno=None)

यह विधि एक यूनिक्स सी कंपाइलर त्रुटि लेबल के प्रारूप में एक त्रुटि संदेश उत्पन्न करता है; प्रारूप '"%s", line %d: ' , जहां %s को वर्तमान स्रोत फ़ाइल के नाम से बदल दिया जाता है और %d को वर्तमान इनपुट लाइन नंबर (वैकल्पिक तर्कों का उपयोग इनको ओवरराइड करने के लिए किया जा सकता है) ।

यह सुविधा shlex उपयोगकर्ताओं को एमएसीएस और अन्य यूनिक्स उपकरणों द्वारा समझे गए मानक, पार्स करने योग्य प्रारूप में त्रुटि संदेश उत्पन्न करने के लिए प्रोत्साहित करने के लिए प्रदान की जाती है।

shlex उपवर्गों के उदाहरणों में कुछ सार्वजनिक उदाहरण चर होते हैं जो या तो लेक्सिकल विश्लेषण को नियंत्रित करते हैं या डीबगिंग के लिए उपयोग किए जा सकते हैं:

shlex.commenters

वर्णों की स्ट्रिंग जिसे टिप्पणी शुरुआती के रूप में पहचाना जाता है। टिप्पणी शुरुआत से अंत तक लाइन के सभी पात्रों को अनदेखा किया जाता है। डिफ़ॉल्ट रूप से सिर्फ '#' शामिल है।

shlex.wordchars

पात्रों का तार जो मल्टी-कैरेक्टर टोकन में जमा होगा। डिफ़ॉल्ट रूप से, सभी ASCII अल्फ़ान्यूमेरिक्स और अंडरस्कोर शामिल हैं। पोसिक्स मोड में, लैटिन -1 सेट में उच्चारण अक्षर भी शामिल हैं। यदि punctuation_chars खाली नहीं है, वर्ण ~-./*?= , जो फ़ाइल नाम विशिष्टताओं और कमांड लाइन मापदंडों में दिखाई दे सकता है, को भी इस विशेषता में शामिल किया जाएगा, और जो भी अक्षर punctuation_chars में दिखाई देते हैं, यदि वे हैं तो उन्हें हटाया नहीं जाएगा वहां मौजूद हैं।

shlex.whitespace

वर्ण जिन्हें व्हाट्सएप और स्किप्ड माना जाएगा। व्हाट्सएप टोकन को बांधता है। डिफ़ॉल्ट रूप से, स्थान, टैब, लाइनफ़ीड और गाड़ी-वापसी शामिल हैं।

shlex.escape

वर्ण जिन्हें पलायन माना जाएगा। यह केवल POSIX मोड में उपयोग किया जाएगा, और डिफ़ॉल्ट रूप से सिर्फ '\' है।

shlex.quotes

वर्ण जिन्हें स्ट्रिंग उद्धरण माना जाएगा। टोकन तब तक जमा होता है जब तक कि एक ही उद्धरण फिर से नहीं मिलता है (इस प्रकार, अलग-अलग उद्धरण प्रकार एक-दूसरे को शेल में संरक्षित करते हैं।) डिफ़ॉल्ट रूप से, ASCII एकल और डबल उद्धरण शामिल हैं।

shlex.escapedquotes

quotes में वर्ण जो भागने में परिभाषित वर्णों की व्याख्या करेगा। यह केवल POSIX मोड में उपयोग किया जाता है, और डिफ़ॉल्ट रूप से सिर्फ '"' शामिल है।

shlex.whitespace_split

यदि True , तो टोकन केवल व्हाट्सएप में विभाजित हो जाएंगे। यह उपयोगी है, उदाहरण के लिए, shlex साथ कमांड लाइनों को पार्स करने के लिए, शेल तर्कों के समान तरीके से टोकन प्राप्त करना। यदि यह विशेषता True , तो punctuation_chars का कोई प्रभाव नहीं होगा, और विभाजन केवल व्हाट्सएप पर होगा। punctuation_chars का उपयोग करते समय, जो कि गोले द्वारा कार्यान्वित करने के लिए पार्सिंग प्रदान करने का इरादा है, व्हाट्सएप को छोड़ना उचित है (डिफ़ॉल्ट मान)।

shlex.infile

वर्तमान इनपुट फ़ाइल का नाम, जैसा कि शुरू में कक्षा के तात्कालिक समय पर निर्धारित किया गया था या बाद के स्रोत अनुरोधों द्वारा स्टैक्ड। त्रुटि संदेशों का निर्माण करते समय इसकी जांच करना उपयोगी हो सकता है।

shlex.instream

इनपुट स्ट्रीम जिसमें से यह shlex उदाहरण अक्षर पढ़ रहा है।

shlex.source

यह विशेषता डिफ़ॉल्ट रूप से None है। यदि आप इसे एक स्ट्रिंग प्रदान करते हैं, तो उस स्ट्रिंग को लेक्सिकल-लेवल इंक्लूजन रिक्वेस्ट के रूप में विभिन्न कीवर्ड्स में source कीवर्ड के रूप में पहचाना जाएगा। यही है, तुरंत निम्नलिखित टोकन एक फ़ाइल नाम के रूप में खोला जाएगा और ईओएफ तक उस धारा से इनपुट लिया जाएगा, जिस बिंदु पर उस धारा के close() विधि को बुलाया जाएगा और इनपुट स्रोत फिर से मूल इनपुट स्ट्रीम बन जाएगा। स्रोत अनुरोधों को किसी भी स्तर के गहरे ढेर किया जा सकता है।

shlex.debug

यदि यह विशेषता संख्यात्मक और 1 या अधिक है, तो एक shlex उदाहरण अपने व्यवहार पर shlex प्रगति आउटपुट प्रिंट करेगा। यदि आपको इसका उपयोग करने की आवश्यकता है, तो आप विवरण जानने के लिए मॉड्यूल स्रोत कोड पढ़ सकते हैं।

shlex.lineno

सोर्स लाइन नंबर (अब तक देखी गई नई लाइनों की गिनती)।

shlex.token

टोकन बफर। अपवादों को पकड़ते समय इसकी जांच करना उपयोगी हो सकता है।

shlex.eof

टोकन फ़ाइल के अंत का निर्धारण करने के लिए उपयोग किया जाता है। यह खाली स्ट्रिंग ( '' ) में, गैर-पॉसिक्स मोड में, और पॉसिक्स मोड में से None में None किया जाएगा।

shlex.punctuation_chars

वर्ण जिन्हें विराम चिह्न माना जाएगा। विराम चिह्न के अक्षरों को एकल टोकन के रूप में लौटाया जाएगा। हालांकि, ध्यान दें कि कोई भी शब्दार्थ वैधता जाँच नहीं की जाएगी: उदाहरण के लिए, '>>>' को एक टोकन के रूप में वापस किया जा सकता है, भले ही इसे शेल के रूप में पहचाना न जाए।

संस्करण 3.6 में नया।

पार्सिंग नियम

गैर-पॉसिक्स मोड में काम करते समय, shlex निम्नलिखित नियमों का पालन करने की कोशिश करेगा।

  • उद्धरण वर्णों को शब्दों के भीतर मान्यता नहीं दी जाती है ( Do"Not"Separate शब्द के रूप में पार्स किया जाता है Do"Not"Separate );
  • भागने वाले पात्रों को मान्यता नहीं दी जाती है;
  • उद्धरण में वर्णों को संलग्न करना उद्धरण के भीतर सभी वर्णों के शाब्दिक मूल्य को संरक्षित करता है;
  • अलग-अलग शब्दों को बंद करना ( "Do"Separate को "Do" और Separate रूप में पार्स किया जाता है);
  • यदि whitespace_split False , तो किसी भी वर्ण को शब्द वर्ण, व्हाट्सएप या एक उद्धरण घोषित नहीं किया जाता है, जो एकल-वर्ण टोकन के रूप में वापस आ जाएगा। यदि यह True , तो shlex केवल shlex में शब्दों को विभाजित करेगा;
  • ईओएफ को एक खाली स्ट्रिंग ( '' ) के साथ संकेत दिया गया है;
  • खाली स्ट्रिंग को पार्स करना संभव नहीं है, भले ही वह उद्धृत हो।

POSIX मोड में काम करते समय, shlex निम्नलिखित पार्सिंग नियमों का पालन करने की कोशिश करेगा।

  • उद्धरण छीन लिए गए हैं, और अलग-अलग शब्द नहीं हैं ( "Do"Not"Separate" एकल शब्द DoNotSeparate रूप में पार्स किया गया है);
  • गैर-उद्धृत एस्केप वर्ण (जैसे '\' ) अगले वर्ण के शाब्दिक मूल्य को संरक्षित करता है जो निम्नानुसार है;
  • उद्धरणों में वर्णों को शामिल करना जो कि escapedquotes हिस्सा नहीं है (उदाहरण के लिए "'" ) उद्धरणों के भीतर सभी वर्णों के शाब्दिक मूल्य को संरक्षित करते हैं;
  • उद्धरणों में उन वर्णों को शामिल करना जो escapedquotes हिस्सा हैं (जैसे '"' ) उद्धरणों में सभी वर्णों के शाब्दिक मूल्य को संरक्षित रखते हैं, साथ ही escape में वर्णित वर्णों के अपवाद escape । बच के वर्ण केवल उद्धरण के बाद ही अपना विशेष अर्थ बनाए रखते escape । उपयोग, या भागने चरित्र ही। अन्यथा भागने चरित्र एक सामान्य चरित्र माना जाएगा।
  • ईओएफ को एक मूल्य के साथ संकेत दिया जाता है;
  • खाली स्ट्रिंग्स ( '' ) की अनुमति है।

गोले के साथ बेहतर संगतता

संस्करण 3.6 में नया।

shlex वर्ग bash , dash और sh जैसे सामान्य यूनिक्स गोले द्वारा किए गए पार्सिंग के साथ संगतता प्रदान करता है। इस संगतता का लाभ उठाने के लिए, निर्माता में punctuation_chars तर्क निर्दिष्ट करें। यह False को डिफॉल्ट करता है, जो प्री-3.6 व्यवहार को संरक्षित करता है। हालाँकि, यदि यह True सेट होता है, तो वर्णों का पार्सिंग ();<>|& बदल जाता है: इन वर्णों के किसी भी भाग को एकल टोकन के रूप में लौटाया जाता है। हालांकि यह गोले के लिए एक पूर्ण पार्सर से कम है (जो कि मानक पुस्तकालय के लिए गुंजाइश से बाहर होगा, वहाँ से बाहर गोले की बहुलता को देखते हुए), यह आपको कमांड लाइनों के प्रसंस्करण को और अधिक आसानी से करने की अनुमति देता है जितना आप अन्यथा कर सकते हैं। वर्णन करने के लिए, आप निम्नलिखित स्निपेट में अंतर देख सकते हैं:

 >>> import shlex
 >>> text = "a && b; c && d || e; f >'abc'; (def \"ghi\")"
 >>> list(shlex.shlex(text))
 ['a', '&', '&', 'b', ';', 'c', '&', '&', 'd', '|', '|', 'e', ';', 'f', '>',
 "'abc'", ';', '(', 'def', '"ghi"', ')']
 >>> list(shlex.shlex(text, punctuation_chars=True))
 ['a', '&&', 'b', ';', 'c', '&&', 'd', '||', 'e', ';', 'f', '>', "'abc'",
 ';', '(', 'def', '"ghi"', ')']

बेशक, टोकन वापस कर दिए जाएंगे जो कि गोले के लिए मान्य नहीं हैं, और आपको लौटे टोकन पर अपनी स्वयं की त्रुटि जांच लागू करने की आवश्यकता होगी।

विराम चिह्न के मान के रूप में True पास करने के बजाय, आप विशिष्ट वर्णों के साथ एक स्ट्रिंग पास कर सकते हैं, जिसका उपयोग यह निर्धारित करने के लिए किया जाएगा कि कौन से वर्ण विराम चिह्न का निर्माण करते हैं। उदाहरण के लिए:

>>> import shlex
>>> s = shlex.shlex("a && b || c", punctuation_chars="|")
>>> list(s)
['a', '&', '&', 'b', '||', 'c']

ध्यान दें

जब punctuation_chars निर्दिष्ट किया जाता है, wordchars विशेषता को वर्णों के साथ संवर्धित किया जाता है ~-./*?= । ऐसा इसलिए है क्योंकि ये वर्ण फ़ाइल नाम (वाइल्डकार्ड सहित) और कमांड-लाइन तर्क (जैसे - रंग --color=auto ) में दिखाई दे सकते हैं। इसलिये:

>>> import shlex
>>> s = shlex.shlex('~/a && b-c --color=auto || d *.py?',
...                 punctuation_chars=True)
>>> list(s)
['~/a', '&&', 'b-c', '--color=auto', '||', 'd', '*.py?']

सर्वोत्तम प्रभाव के लिए, punctuation_chars को posix=True के साथ संयोजन में सेट किया जाना चाहिए। (ध्यान दें कि shlex लिए shlex posix=False डिफ़ॉल्ट है।)