为什么在打印时出现IOError: (9, '坏文件描述符')错误?
我在一台运行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()