2010-08-06 13 views
5

मैं जो अजगर 2.5 में ठीक चलाता है इस कोड लेकिन 2.7 में नहीं है:पायथन 2.7/exec/क्या गलत है?

import sys 
import traceback 
try: 
    from io import StringIO 
except: 
    from StringIO import StringIO 

def CaptureExec(stmt): 
    oldio = (sys.stdin, sys.stdout, sys.stderr) 
    sio = StringIO() 
    sys.stdout = sys.stderr = sio 
    try: 
     exec(stmt, globals(), globals()) 
     out = sio.getvalue() 
    except Exception, e: 
     out = str(e) + "\n" + traceback.format_exc() 
    sys.stdin, sys.stdout, sys.stderr = oldio 
    return out 

print "%s" % CaptureExec(""" 
import random 
print "hello world" 
""") 

और मैं मिलता है:

 
string argument expected, got 'str' 
Traceback (most recent call last): 
    File "D:\3.py", line 13, in CaptureExec 
    exec(stmt, globals(), globals()) 
    File "", line 3, in 
TypeError: string argument expected, got 'str' 
+2

माइनर टिप्पणियों की तरह कुछ लिखने की ज़रूरत: pythonic शैली केवल कक्षाओं के लिए TitleCase उपयोग करने के लिए है, यह होना चाहिए 'captureExec' या' capture_exec'। साथ ही, आपको विशेष रूप से 'प्रयास' में 'आयात करें' को पकड़ना चाहिए ... ब्लॉक को छोड़कर। 'बाइट्सियो' के लिए – katrielalex

उत्तर

14

io.StringIO अजगर 2.7 में भ्रामक है क्योंकि यह 3.x बाइट्स से बैकपोर्टेड है/स्ट्रिंग दुनिया। इस कोड को तुम्हारा के रूप में ही त्रुटि हो जाता है:

from io import StringIO 
sio = StringIO() 
sio.write("Hello\n") 

कारणों:

Traceback (most recent call last): 
    File "so2.py", line 3, in <module> 
    sio.write("Hello\n") 
TypeError: string argument expected, got 'str' 

आप केवल पायथन 2.x का उपयोग कर रहे हैं, तो पूरी तरह io मॉड्यूल को छोड़, और StringIO साथ चिपके रहते हैं।

from io import BytesIO as StringIO 
+0

+1। मुझे लगता है कि बहुत पुराना 2.x कोड 2.7 के साथ बहुत संगत नहीं होने वाला है:/लगता है जैसे 2.7 3.x के लिए एक कदम पत्थर से अधिक होने जा रहा है –

2

यह बुरी खबर

io.StringIO यूनिकोड के साथ काम करना चाहता है: क्या तुम सच में io उपयोग करना चाहते हैं, करने के लिए अपने आयात बदल जाते हैं। आप आप स्ट्रिंग आप इस

print "%s" % CaptureExec(""" 
import random 
print u"hello world" 
""") 

तथापि print की तरह मुद्रित करने के लिए वास्तव में इस के लिए टूट गया है चाहता हूँ के रूप में यह 2 StringIO को लिखते हैं का कारण बनता है के सामने एक u डालकर इसे ठीक कर सकते हैं लगता है कि हो सकता है। पहले एक u"hello world" जो ठीक है, लेकिन फिर यह इतना बजाय "\n"

साथ इस प्रकार आप इस

print "%s" % CaptureExec(""" 
import random 
sys.stdout.write(u"hello world\n") 
""") 
संबंधित मुद्दे