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