2012-10-04 11 views
6

Soy bastante nuevo en Python, así que todavía estoy aprendiendo el idioma. Una de las cosas que encontré fue la reasignación de sys.stdout para cambiar la salida predeterminada de impresión. Así que escribí esto como una prueba:sys.stdout no se reasigna a sys .__ stdout__

import sys 
sys.stdout = open('log.txt','a') 
print('hey') 
sys.stdout.close() 
sys.stdout = sys.__stdout__ 
print('hi') 

'Hey' se escribe en el archivo, pero 'hola' muestra en ninguna parte. Sin embargo, esto funciona como se esperaba, y 'bueno' se escribe en el archivo, y 'hola' se imprime a la salida de la consola:

import sys 
sys.__stdout__ = sys.stdout 
sys.stdout = open(r'C:\Users\Vincent\Documents\Python\log.txt','a') 
print('hey') 
sys.stdout.close() 
sys.stdout = sys.__stdout__ 
print('hi') 

En pocas palabras es un pequeño problema eso no importa demasiado, yo soy Me pregunto si hay una razón discernible por la cual no está funcionando como debería. He probado esto en Windows 7 Home Premium con IDLE y pyscripter en v3.2.3 y mi portátil python v3.2.1.

+0

¿Cómo se ejecuta este script? No dijiste si la primera 'impresión' funcionó o no. * Cuando asigno alguna otra variable a sys.stdout al principio y la vuelvo a cambiar, funciona * Sería mejor escribir un código que ilustre esto y describir su salida. –

Respuesta

0

me gustaría probar esta solución (no usar sys.__stdout__ en absoluto, porque su entorno podría haber hecho tanto sys.stdout y sys.__stdout__ distinta):

old_stdout = sys.stdout 
sys.stdout = open('log.txt','a') 
print('hey') 
sys.stdout.close() 
sys.stdout = old_stdout 

backuping la referencia de sys.stdout parece la forma más segura de hacerlo. Funcionó en otro caso ligeramente diferente: stdout redirect from Jupyter notebook is landing in the terminal

2

En IDLE, sys.__stdout__ es la salida estándar original del programa, que no va a ninguna parte, ya que no es una aplicación de consola. En otras palabras, IDLE ya ha reemplazado sys.stdout con algo más (su propia ventana de consola), por lo que está dando dos pasos hacia atrás reemplazando su propio stdout con __stdout__.

Cuestiones relacionadas