2012-06-30 17 views
29

मेरे पास पाइथन 2 केवल कोड का एक बड़ा टुकड़ा है। यह शुरुआत में पायथन 3 की जांच करना चाहता है, और अगर Python3 का उपयोग किया जाता है तो बाहर निकलें। तो मैंने कोशिश की:पायथन 2 कोड: यदि पायथन 3 तो sys.exit()

import sys 

if sys.version_info >= (3,0): 
    print("Sorry, requires Python 2.x, not Python 3.x") 
    sys.exit(1) 

print "Here comes a lot of pure Python 2.x stuff ..." 
### a lot of python2 code, not just print statements follows 

हालांकि, बाहर निकलना नहीं होता है। उत्पादन होता है:

$ python3 testing.py 
    File "testing.py", line 8 
     print "Here comes a lot of pure Python 2.x stuff ..." 
                 ^
SyntaxError: invalid syntax 

इसलिए, यह अजगर चेक की तरह लग रहा है कुछ भी निष्पादित करने से पहले पूरे कोड, और इसलिए त्रुटि।

क्या Python3 कोड का उपयोग करने के लिए python2 कोड के लिए एक अच्छा तरीका है, और यदि ऐसा कुछ दोस्ताना प्रिंट करें और फिर बाहर निकलें?

उत्तर

51

पायथन इसे निष्पादित करने से पहले अपनी स्रोत फ़ाइल बाइट-संकलित करेगा। पूरी फ़ाइल को कम से कम पार्स सही ढंग से अवश्य होना चाहिए, अन्यथा आपको SyntaxError मिल जाएगा।

आपकी समस्या का सबसे आसान समाधान एक छोटे से आवरण को लिखना है जो पाइथन 2.x और 3.x दोनों के रूप में पार्स करता है। उदाहरण:

import sys 
if sys.version_info >= (3, 0): 
    sys.stdout.write("Sorry, requires Python 2.x, not Python 3.x\n") 
    sys.exit(1) 

import the_real_thing 
if __name__ == "__main__": 
    the_real_thing.main() 

बयान import the_real_thing केवलif बयान के बाद निष्पादित किया जाएगा, ताकि इस मॉड्यूल में कोड अजगर 3.x कोड के रूप में पार्स करने के लिए आवश्यक नहीं है।

+0

आप 'if __name__ == "foo" 'ब्लॉक का उपयोग भी कर सकते हैं, जो' if __name__ == "__main __" की तरह काम करता है लेकिन 'foo' आयात होने पर निष्पादित होता है – inspectorG4dget

+2

इसे और अधिक नहीं माना जाएगा * पायथनिक * ईएएफपी का उपयोग करने के लिए और केवल 'try' ब्लॉक के अंदर the_real_thing का आयात डालें? – martineau

+1

@ मार्टिनौ: मैं इस मामले में हाथ में ऐसा नहीं करूँगा। 'आयात' बहुत सफल हो सकता है, और अन्य त्रुटियां' मुख्य() 'में हो सकती हैं। आप कोशिश करने/छोड़कर 'the_real_thing.main() 'संलग्न नहीं करना चाहते हैं। –