почему я получаю ошибку IOError: (9, «Bad file descriptor») при создании заявлений на печать?

Я запускаю сценарий python2.5 на сервере Windows 2003 в качестве службы. Я получаю эту ошибку для простых заявлений печати:

IOError: (9, 'Bad file descriptor') 

Я удалил все операторы печати, потому что они использовались только для целей разработки, но я не уверен, почему заявление печати вызовет у меня какой-либо greif. Я запускал один и тот же сценарий не как сервис без каких-либо серьезных проблем. Просто интересно, есть ли у кого-нибудь еще какое-либо понимание?

    Вы не можете печатать, потому что sys.stdout недоступен, если не работает в качестве сеанса консоли.

    Вместо использования операторов print вы можете использовать модуль logging чтобы вы могли установить loglevel и записать все критические вещи в журнал системных событий.


    Следует отметить, что вы все равно можете заставить его работать (или молча игнорировать проблему), делая что-то вроде этого:

    Чтобы записать файл в поток вывода:

     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() 

    В Python 2.x это ожидаемое поведение. В этом отчете об ошибке Христиан Хеймс объясняет, что это дизайнерское решение:

    Я рекомендую не менять код так поздно в выпуске Python 2.7. Изменение поведения слишком запутанно. И это не ошибка, а дизайнерское решение. Более пяти лет назад я реализую части взаимодействия IO с операционной системой для Python 3.0. Я намеренно НЕ модифицировал порты версии 2.6.

    Он также рекомендует обходной путь для получения поведения print() Python 3.x в 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.")