为什么我在制作print语句时会出现IOError:(9,'Bad file descriptor')错误?

Ric*_*ard 20 python windows service

我在Windows 2003服务器上运行python2.5脚本作为服务.我收到此错误的简单打印声明:

IOError: (9, 'Bad file descriptor')
Run Code Online (Sandbox Code Playgroud)

我删除了所有的print语句,因为它们仅用于开发目的,但我不确定为什么print语句会导致我任何greif.我运行相同的脚本而不是服务而没有任何重大问题.只是想知道其他人是否有任何见解?

Wol*_*lph 28

您无法打印,因为sys.stdout在未作为控制台会话运行时不可用.

print您可以考虑使用该logging模块而不是使用语句,以便设置日志级别并将所有关键事项写入系统事件日志.


应该注意的是,您仍然可以通过执行以下操作来使其工作(或者默默地忽略该问题):

要为每个输出流写入文件:

import sys
sys.stdout = open('stdout.txt', 'w')
sys.stderr = open('stderr.txt', 'w')
Run Code Online (Sandbox Code Playgroud)

要写入单个文件:

import sys
sys.stdout = sys.stderr = open('output.txt', 'w')
Run Code Online (Sandbox Code Playgroud)

或者默默地忽略所有打印语句:

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

sys.stdout = sys.stderr = NullWriter()
Run Code Online (Sandbox Code Playgroud)

  • 更具体地说,如果您的程序未在控制台中运行,则前三个文件描述符(对应于stdin,stdout和stderr)不可用. (7认同)
  • 另一种静默忽略所有打印语句的方法`sys.stdout = open(os.devnull,'w')` (2认同)

小智 5

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

我建议不要在 Python 2.7 发布周期的这么晚才更改代码。行为的改变太令人困惑了。而且这也不是错误,而是设计决策。五年多前,我为 Python 3.0 实现了与操作系统的部分 IO 交互。我故意没有将修改移植到 2.6。

他还推荐了一种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.")
Run Code Online (Sandbox Code Playgroud)