python3 example python printing exec

example - range python 3



Python: obtenga la salida impresa en una declaraciĆ³n ejecutiva (5)

Algo como:

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

debería ejecutar el código en un proceso diferente y canalizar la salida de vuelta a su programa principal a través de codeproc.stdout . Pero no lo he usado personalmente, así que si hay algo que he hecho mal, siéntase libre de señalarlo: P

Tengo un pequeño problema. Aquí está mi código:

code = """ i = [0,1,2] for j in i : print j """ result = exec(code)

¿Cómo puedo obtener las cosas que imprimen superadas? ¿Cómo puedo obtener algo como esto?

0 1 2

Saludos y gracias,


Aquí está la versión amigable para Py3 de la respuesta de @ Jochen. También agregué la cláusula try-except 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())


Aquí hay una pequeña corrección de la respuesta de Frédéric. Necesitamos manejar una posible excepción en exec() para regresar a la stdout normal. De lo contrario, no podríamos ver resultados de print posteriores:

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


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

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


Tenía la misma idea que Frédéric, pero escribí un administrador de contexto para manejar el reemplazo de stdout:

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