2014-04-25 4 views
7

से कथन और एक पंक्ति पायथन स्क्रिप्ट्स निम्न लिनर पायथन कोड के लिए मुझे सिंटैक्स त्रुटि क्यों प्राप्त होती है?यदि कमांड लाइन

python -c 'import re; if True: print "HELLO";' 
    File "<string>", line 1 
    import re; if True: print "HELLO"; 
       ^
SyntaxError: invalid syntax 

निम्नलिखित कोड सिर्फ ठीक काम करता है

python -c 'if True: print "HELLO";' 

मैं कमांड लाइन से एक पंक्ति पर मेरी इरादा स्क्रिप्ट को निष्पादित करने के लिए अपने एक पंक्ति को कैसे बदल सकते हैं?

+1

कोई जवाब नहीं: आप सामान को एक पंक्ति में क्यों रखना चाहते हैं? लाभ क्या है, यह वास्तविक लिपि से बेहतर क्यों है? – guettli

+0

लाभ यह है कि मेरे पास सिस्टम पर कोई फ़ाइल लिखने की अनुमति नहीं है जिसे मैं चला रहा हूं। साथ ही, मैं आमतौर पर एक लाइनर को मित्रों को कॉपी और पेस्ट करना चाहता हूं, और इससे ऐसा होता है ताकि उन्हें फ़ाइलों को बनाने और निष्पादित अनुमतियां न दें। – AffluentOwl

+1

देखें http://stackoverflow.com/questions/6167127/how-to-put-multiple-statements-in-one-line – Ashkan

उत्तर

6

एक विकल्प न्यू लाइन एस्केप अनुक्रम \n का उपयोग कर $'string' प्रारूप के साथ आदेश निर्दिष्ट करने के लिए है।

python -c $'import re\nif True: print "HELLO";' 

नोट: इस तरह के बैश और zsh के रूप में गोले के द्वारा समर्थित है, लेकिन वैध POSIX श नहीं है।

@slaadvak से उल्लेख किया है, वहाँ कुछ अन्य समाधान यहां हैं: Executing Python multi-line statements in the one-line command-line

4

समस्या आयात विवरण के साथ विशेष रूप से नहीं है, यह कि आपके पास नियंत्रण प्रवाह विवरण से पहले कुछ भी है। यह काम नहीं करेगा, या तो:

[email protected]:~> python -c 'a = "1234" ; if True: print "hi"' 
    File "<string>", line 1 
    a = "1234" ; if True: print "hi" 
       ^
SyntaxError: invalid syntax 

अजगर संदर्भ (https://docs.python.org/2/reference/compound_stmts.html) के अनुसार, ';' केवल "सरल कथन" को एक साथ जोड़ने के लिए उपयोग किया जा सकता है। इस मामले में आप if True: के साथ सरल कथन import re संयोजन कर रहे हैं। if True एक साधारण कथन नहीं है, क्योंकि यह प्रवाह नियंत्रण शुरू कर रहा है, और इसलिए यह एक यौगिक बयान है। कम से कम मैं दस्तावेज की व्याख्या कैसे करता हूं।

यहाँ पायथन संदर्भ से पूरा टेक्स्ट है: '। खंड'

यौगिक बयान एक या अधिक से मिलकर एक खंड एक शीर्षक और एक के होते हैं एक विशेष के खंड हेडर 'सूट।' यौगिक बयान सभी एक ही इंडेंटेशन स्तर पर हैं। प्रत्येक खंड शीर्षलेख एक विशिष्ट पहचान वाले कीवर्ड के साथ शुरू होता है और कोलन के साथ समाप्त होता है। एक सूट एक खंड द्वारा नियंत्रित बयान का एक समूह है। एक सूट एक या अधिक अर्धविराम द्वारा अलग किए हेडर के रूप में एक ही लाइन पर साधारण बयान हो सकता है, शीर्षक की पेट के निम्नलिखित, या यह बाद में लाइनों

compound_stmt ::= if_stmt 
        | while_stmt 
        | for_stmt 
        | try_stmt 
        | with_stmt 
        | funcdef 
        | classdef 
        | decorated 
suite   ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT 
statement  ::= stmt_list NEWLINE | compound_stmt 
stmt_list  ::= simple_stmt (";" simple_stmt)* [";"] 
+1

इस उत्तर के रूप में उपरोक्त मेरे प्रश्न के लिए "क्यों" प्रदान करता है। और रिनेंट का कामकाज प्रदान करता है। – AffluentOwl

1

आप पर एक या अधिक दांतेदार बयान हो सकता है तर्क में सीधे न्यूलाइन एम्बेड कर सकते हैं। इस सीमा के आसपास काम करने के लिए

$ python -c 'import re 
> if True: 
> print "HELLO" 
> ' 
+0

आप यह कैसे करते हैं? क्या कुछ विशेष कीबोर्ड संयोजन है? क्योंकि केवल एंटर दबाकर एक नई न्यूलाइन एम्बेड किए बिना लाइन निष्पादित करता है। – AffluentOwl

+2

यदि आप किसी भी पॉज़िक्स-अनुरूप शेल का उपयोग कर रहे हैं, तो उद्धृत स्ट्रिंग के बीच में एंटर दबाकर कमांड निष्पादित नहीं करना चाहिए (जब तक, उदाहरण के लिए, आपने एंटर कुंजी के लिए डिफ़ॉल्ट 'रीडलाइन' बाइंडिंग को बदल दिया है)। – chepner

+0

मैं उबंटू का उपयोग कर रहा हूं। क्या यह शायद पॉज़िक्स-अनुरूप शेल के बजाय एक बैश खोल है? – AffluentOwl

1

क्यों मैं निम्नलिखित एक लाइनर अजगर कोड के लिए सिंटैक्स त्रुटि प्राप्त होगा?

Python grammarsmall_stmt ';' compound_stmt न करे हो सकता है। -c तर्क शायद file_input के रूप में व्याख्या की है है:

fileinput: (NEWLINE | stmt)* ENDMARKER 
stmt: simple_stmt | compound_stmt 
simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE 
small_stmt: import_stmt <in this case> 
compound_stmt: if_stmt <in this case> 

नोट: simple_stmt के अंत में एक नई पंक्ति होती है।if_stmtsmall_stmt';' के बाद यह small_stmt का पालन नहीं कर सकता है। small_stmt के बाद compound_stmt को पेश करने के लिए एक नई लाइन आवश्यक है।

यह एक मुद्दा है क्योंकि bash बहु तर्क की अनुमति देता है नहीं है, बस खोलने एकल उद्धरण बंद नहीं जब तक आप कर उदा .:

$ python -c ' 
> import re 
> if 1: 
> print(1) 
> ' 
1 

नोट करते हैं: खोल से ही यहाँ > मुद्रित कर रहे हैं। यह हाथ से नहीं दर्ज किया गया है।