Подтвердить что ты не робот

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

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

IOError: (9, 'Bad file descriptor')

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

4b9b3361

Ответ 1

Вы не можете печатать, потому что 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()

Ответ 2

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