почему я получаю ошибку IOError: (9, «Bad file descriptor») при выполнении операторов печати? - PullRequest
17 голосов
/ 20 ноября 2010

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

IOError: (9, 'Bad file descriptor')

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

Ответы [ 2 ]

26 голосов
/ 20 ноября 2010

Вы не можете печатать, потому что 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()
3 голосов
/ 11 марта 2016

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

Я рекомендую не менять код так поздно в цикле выпуска Python 2.7.Изменение в поведении слишком запутанно.И это не ошибка, а дизайнерское решение тоже.Более пяти лет назад я реализовал части взаимодействия ввода-вывода с операционной системой для 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.")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...