¿Por qué recibo el error IOError: (9, ‘Descriptor de archivo incorrecto’) al hacer las declaraciones de impresión?

Estoy ejecutando un script python2.5 en un servidor de Windows 2003 como un servicio. Estoy recibiendo este error para las simples declaraciones de impresión:

IOError: (9, 'Bad file descriptor') 

Eliminé todas las declaraciones impresas porque solo se usaron para fines de desarrollo, pero no estoy seguro de por qué una statement impresa me causaría un error. Ejecuté el mismo script no como un servicio sin mayores problemas. ¿Solo me pregunto si alguien más tiene alguna idea?

No puede imprimir porque sys.stdout no está disponible cuando no se ejecuta como una sesión de consola.

En lugar de usar sentencias de print , puede considerar usar el módulo de logging para poder establecer el nivel de registro y escribir todas las cosas críticas en el registro de eventos del sistema.


Debe tenerse en cuenta que aún puede hacer que funcione (o ignorar el problema en silencio) haciendo algo como esto:

Para escribir en un archivo por flujo de salida:

 import sys sys.stdout = open('stdout.txt', 'w') sys.stderr = open('stderr.txt', 'w') 

Para escribir en un solo archivo:

 import sys sys.stdout = sys.stderr = open('output.txt', 'w') 

O ignorar silenciosamente todas las declaraciones impresas:

 import sys class NullWriter(object): def write(self, value): pass sys.stdout = sys.stderr = NullWriter() 

En Python 2.x, este es el comportamiento esperado. En este informe de error , Christian Heimes explica que es una decisión de diseño:

Recomiendo no cambiar el código tan tarde en el ciclo de lanzamiento de Python 2.7. Un cambio en el comportamiento es demasiado confuso. Y no es un error, sino una decisión de diseño, también. Hace más de cinco años implementé partes de la interacción de E / S con el sistema operativo para Python 3.0. Yo deliberadamente NO porté modificaciones a 2.6.

También recomienda una solución para obtener el comportamiento de print() estilo Python 3.x en Python 2.7:

 from __future__ import print_function import sys if sys.executable.endswith("pythonw.exe"): sys.stdout = sys.stdout = None print("can handle sys.stdout = None just fine.")