开发者

why am I getting IOError: (9, 'Bad file descriptor') error while making print statements?

开发者 https://www.devze.com 2023-01-26 15:12 出处:网络
I am running a python2.5 script on a windows 2003 server as a service. I am getting this error for simple print statments:

I am running a python2.5 script on a windows 2003 server as a service. I am getting this error for simple print statments:

IOError: (9, 'Bad file descriptor')

I deleted all the print statements because they 开发者_运维问答were only used for development purposes, but I am unsure why a print statement would cause me any greif. I ran the same script not as a service without any major problems. Just wondering if anyone else has any insight?


You can't print because sys.stdout is not available when not running as a console session.

Instead of using print statements you can consider using the logging module so you can set the loglevel and write all critical things to the system event log.


It should be noted that you can still get it to work (or silently ignore the problem) by doing something like this:

To write to a file per output stream:

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

To write to a single file:

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

Or to silently ignore all print statements:

import sys
class NullWriter(object):
    def write(self, value): pass

sys.stdout = sys.stderr = NullWriter()


In Python 2.x, this is the expected behavior. In this bug report, Christian Heimes explains that it is a design decision:

I recommend against changing the code so late in the Python 2.7 release cycle. A change in behavior is too confusing. And it's not a bug but a design decision, too. Over five years ago I implement parts of the IO interaction with the operating system for Python 3.0. I deliberately did NOT port modifications to 2.6.

He also recommends a workaround for obtaining Python 3.x-style print() behavior in 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.")
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号