为什么在打印时出现IOError: (9, '坏文件描述符')错误?

22 投票
2 回答
18440 浏览
提问于 2025-04-16 07:22

我在一台运行Windows 2003的服务器上,以服务的形式运行一个Python 2.5的脚本。对于简单的打印语句,我遇到了这个错误:

IOError: (9, 'Bad file descriptor')

我把所有的打印语句都删掉了,因为它们只是用来开发时调试的,但我不明白为什么打印语句会给我带来麻烦。我在没有作为服务运行的情况下运行同样的脚本,没有遇到什么大问题。想知道有没有人能给我一些见解?

2 个回答

5

在Python 2.x中,这种行为是预期中的。Christian Heimes在这个错误报告中解释说,这是一个设计上的决定:

我建议不要在Python 2.7的发布周期中这么晚去修改代码。行为的改变会让人感到困惑。而这并不是一个错误,而是一个设计决定。五年前,我为Python 3.0实现了与操作系统的IO交互部分。我故意没有把这些修改移植到2.6版本。

他还推荐了一种方法,可以在Python 2.7中获得类似Python 3.x的print()行为:

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.")
31

你不能使用打印功能,因为当你不是在控制台会话中运行时,sys.stdout 是不可用的。

与其使用 print 语句,不如考虑使用 logging 模块,这样你可以设置日志级别,把所有重要的信息写入系统事件日志。


需要注意的是,你仍然可以通过一些方法让它正常工作(或者悄悄忽略这个问题),比如:

要将输出写入文件,可以使用以下方法:

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

要写入一个单独的文件,可以使用:

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

或者悄悄忽略所有打印语句,可以使用:

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

sys.stdout = sys.stderr = NullWriter()

撰写回答