2010-11-20 3 views
16

Я запускаю скрипт python2.5 на сервере Windows 2003 в качестве службы. Я получаю эту ошибку для простых печати statments:Почему я получаю сообщение об ошибке IOError: (9, 'Bad file descriptor') при создании заявлений на печать?

IOError: (9, 'Bad file descriptor') 

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

ответ

24

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

Более конкретно, первое три дескриптора файла (соответствующие stdin, stdout и stderr) недоступны, если ваша программа не запускается в консоли. –

+0

+1 Игнасио Васкес-Абрамс, очень полезно. – Wolph

+1

Другой способ молча игнорировать все операторы печати 'sys.stdout = open (os.devnull, 'w')' –

3

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

I recommend against changing the code so late in the Python 2.7 release cycle. A change in behavior is too confusing. And it's not a bug but a design decision, too. Over five years ago I implement parts of the IO interaction with the operating system for Python 3.0. I deliberately did NOT port modifications to 2.6.

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

Derrick, был [справедливая битва за этот ответ] (http://meta.stackoverflow.com/q/318893/). Опытные пользователи, которые упорно трудятся, чтобы сохранить качество информации на этом сайте и как можно помечены как содержащие только ссылку на офф-сайта информацию. Мы склонны препятствовать таким типам ответов, поскольку ссылка может опуститься, что сделало бы ответ бесполезным. Вот почему он был опущен, и почему у него было несколько голосов, чтобы удалить бросок против него. Тем не менее, я вижу ценность в предоставленной вами ссылке и не думаю, что удаление этого ответа является подходящим решением. –

+0

Вместо этого я и другой пользователь отредактировали соответствующую информацию из ссылки в ваш ответ. Это должно помочь избежать ожидающего удаления ответа и, возможно, получить еще несколько повышений. Поскольку вы новый пользователь, мне жаль, что у вас был плохой опыт работы с сайтом. При публикации ответов в будущем, пожалуйста, помните, что хорошие ответы полностью автономны.Лучше всего сделать то, что я сделал здесь, и отредактировать соответствующую информацию в ответе, включая ссылку только в качестве дополнения. Во всяком случае, просто хотел объяснить забавный бизнес. Удачи тебе! –

+0

Спасибо за обновление. Даже я до сих пор не знаю, считаю ли я его ошибкой. Заявление о печати является де-факто инструментом отладки, поэтому что-то настолько простое, по-моему, никогда не прекратится. В вашем редактировании есть строка кода: «sys.stdout = sys.stdout = None»; если это вместо этого «sys.stdout = sys.stderr = None»? – Derrick

Смежные вопросы