2010-08-06 33 views
5

Bu Python 2.5 iyi çalışır kod ama 2.7'de vardır:python 2.7/exec/sorun nedir?

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" 
""") 

Ve olsun: o 3.x bayt gelen backported çünkü

 
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

Minör yorumları gibi şeyler yazmak gerekir: Pythonictir tarzı sadece sınıflar için TitleCase kullanmaktır, olması gerektiği "captureExec" veya "capture_exec". Ayrıca, 'try ... except' bloğunda 'ImportError' özelliğini özellikle yakalamalısınız. BytesIO için – katrielalex

cevap

14

io.StringIO Python 2.7 kafa karıştırıcı/dize dünyası. Bu kod sizinkiyle aynı hatayı alır:

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

nedenler:

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

sadece Python 2.x kullanıyorsanız, o zaman tamamen io modülünü atlamak ve StringIO ile sopa.

io.StringIO unicode çalışmak istiyor

from io import BytesIO as StringIO 
+0

+1. Bence çok eski 2.x kodu 2.7 ile çok uyumlu olmayacak:/2.7 gibi görünüyor, 3.x'e kadar bir basamak taşı olacak –

2

O kadar kötü haber: Gerçekten io kullanmak istiyorsanız, sizin ithalat değiştirin. Sen bunu 2 StringIO yazar neden olarak gerçekten bunun için bozuldu bu

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

ancak print gibi yazdırmak istediğiniz dize önünde bir u koyarak tamir edebiliriz düşünebilir. İlki gayet u"hello world", ama sonra o kadar yerine "\n"

ile takip Bunu

print "%s" % CaptureExec(""" 
import random 
sys.stdout.write(u"hello world\n") 
""")