Почему я получаю ошибку IOError: (9, "Bad file descriptor" ) при создании заявлений на печать?
Я запускаю python2.5 script на сервере Windows 2003 в качестве службы. Я получаю эту ошибку для простых состояний печати:
IOError: (9, 'Bad file descriptor')
Я удалил все операторы печати, потому что они были использованы только для целей разработки, но я не уверен, почему выражение печати вызовет у меня какой-либо greif. Я запускал тот же script не как сервис без каких-либо серьезных проблем. Просто интересно, есть ли у кого-нибудь еще прозрение?
Ответы
Ответ 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.")