2010-10-11 6 views

Respuesta

31

que tenían la misma idea que Frédéric, pero escribí un gestor de contexto para manejar la sustitución de la salida estándar:

import sys 
import StringIO 
import contextlib 

@contextlib.contextmanager 
def stdoutIO(stdout=None): 
    old = sys.stdout 
    if stdout is None: 
     stdout = StringIO.StringIO() 
    sys.stdout = stdout 
    yield stdout 
    sys.stdout = old 

code = """ 
i = [0,1,2] 
for j in i : 
    print j 
""" 
with stdoutIO() as s: 
    exec code 

print "out:", s.getvalue() 
+0

increíble gracias mucho – user462794

+0

tengo un: Archivo "D: \ Documents \ perso \ dev \ meta \ Server.py", línea 77, en decompress_html con self.stdoutIO() como s: AttributeError: __exit__ – user462794

+0

@ user462794: Parece que ignoró la línea '@ contextlib.contextmanager' –

1

Algo así como:

codeproc = subprocess.Popen(code, stdout=subprocess.PIPE) 
print(codeproc.stdout.read()) 

debe ejecutar el código en un proceso y tubería diferente la salida de nuevo a su programa principal a través de codeproc.stdout. Pero yo no he usado personalmente, por lo que si hay algo que he hecho mal dude en señalarlo: P

+0

debo hacerlo en Python sólo:/gracias por la respuesta – user462794

+0

se encuentra solamente en Python: P – Blam

+0

tengo un: codeproc = subprocess.Popen (comando, stdout = subprocess.PIPE) Archivo "C: \ DEV \ Python27 \ lib \ subprocess.py", línea 672, en __init__ errread, errwrite) Archivo "C: \ DEV \ Python27 \ lib \ subprocess.py ", línea 882, en _execute_child startupinfo) WindowsError: [Error 2] Le fichier spécifié est introuvable (archivo no encontrado en francés) – user462794

7

Puede redirigir la salida estándar a una cadena para la duración de la llamada exec:

code = """ 
i = [0,1,2] 
for j in i : 
print j 
""" 

from cStringIO import StringIO 
old_stdout = sys.stdout 
redirected_output = sys.stdout = StringIO() 
exec(code) 
sys.stdout = old_stdout 

print redirected_output.getvalue() 
+2

Solo quería agregar la nota que hace que este amigo de Python 3 Entonces, debe importar 'StringIO' de' io' => 'de io import StringIO'. – idjaw

2

Aquí es el AP3-amigable versión de @ respuesta de Jochen. También agregué try-except cláusula para recuperar en caso de errores en el code.

import sys 
from io import StringIO 
import contextlib 

@contextlib.contextmanager 
def stdoutIO(stdout=None): 
    old = sys.stdout 
    if stdout is None: 
     stdout = StringIO() 
    sys.stdout = stdout 
    yield stdout 
    sys.stdout = old 

code = """ 
i = [0,1,2] 
for j in i : 
    print(j) 
""" 
with stdoutIO() as s: 
    try: 
     exec(code) 
    except: 
     print("Something wrong with the code") 
print "out:", s.getvalue() 
1

Aquí hay una pequeña corrección de la respuesta de Frédéric. Necesitamos manejar una posible excepción en exec() para regresar normal stdout. De otra manera no podríamos ver más lejos print salidas:

code = """ 
i = [0,1,2] 
for j in i : 
print j 
""" 

from cStringIO import StringIO 
old_stdout = sys.stdout 
redirected_output = sys.stdout = StringIO() 
try: 
    exec(code) 
except: 
    raise 
finally: # ! 
    sys.stdout = old_stdout # ! 

print redirected_output.getvalue() 
... 
print 'Hello, World!' # now we see it in case of the exception above 
Cuestiones relacionadas