windows 为什么在执行打印语句时出现 IOError: (9, 'Bad file descriptor') 错误?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4230855/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
why am I getting IOError: (9, 'Bad file descriptor') error while making print statements?
提问by Richard
I am running a python2.5 script on a windows 2003 server as a service. I am getting this error for simple print statments:
我在 Windows 2003 服务器上作为服务运行 python2.5 脚本。对于简单的打印语句,我收到此错误:
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?
我删除了所有打印语句,因为它们仅用于开发目的,但我不确定为什么打印语句会导致我出现任何问题。我运行相同的脚本而不是作为服务没有任何重大问题。只是想知道是否有人有任何见解?
回答by Wolph
You can't print because sys.stdout
is not available when not running as a console session.
您无法打印,因为sys.stdout
在不作为控制台会话运行时不可用。
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.
print
您可以考虑使用logging
模块而不是使用语句,这样您就可以设置日志级别并将所有关键内容写入系统事件日志。
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()
回答by Derrick
In Python 2.x, this is the expected behavior. In this bug report, Christian Heimes explains that it is a design decision:
在 Python 2.x 中,这是预期的行为。在这个错误报告中,Christian Heimes 解释说这是一个设计决定:
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.
我建议不要在 Python 2.7 发布周期的这么晚才更改代码。行为的改变太令人困惑了。这也不是错误,而是设计决策。五年多前,我为 Python 3.0 实现了与操作系统的部分 IO 交互。我故意没有将修改移植到 2.6。
He also recommends a workaround for obtaining Python 3.x-style print()
behavior in Python 2.7:
他还推荐了一种print()
在 Python 2.7 中获得 Python 3.x 风格行为的解决方法:
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.")