прерывистая ошибка Bad File Descriptor

У меня есть скрипт для чтения сообщений на почтовом сервере и сохранения их в определенных папках на основе содержимого тел сообщений. Периодически, обычно примерно один или два раза в день, происходит сбой при выполнении этой части кода:

if not os.path.isfile(att_path) :
    # finally write the stuff
    fp = open(att_path, 'wb')
    fp.write(part.get_payload(decode=True))
    fp.close()
    ext = att_path.split(".")[-1]
    print "att_path",att_path
    f = open(att_path.replace("."+ext,".txt"),'wb')
    f.write(headers)
    f.write("\n\n\n")
    f.write(body)
    f.close()
    filelist.append(vdir+"/"+filename)
    messageReceived = True
else:
    noErrors = False
    errFiles.append(vdir+"/"+filename)

Он сохраняет фактическое вложение в ожидаемом каталоге, но не последующий текстовый файл с заголовками и информацией тела. Поскольку выдается исключение («[Errno 9] Bad file descriptor»), электронное письмо не помечается для удаления и остается на сервере до тех пор, пока сохраненное вложение не будет удалено или перемещено, после чего оба файла будут сохранены без каких-либо ошибок. .

Я озадачен тем, что может быть причиной этого, так как он обрабатывает несколько сотен электронных писем каждый день без каких-либо проблем, за исключением этой прерывистой проблемы.


person CCKx    schedule 05.03.2015    source источник
comment
У вас есть полное сообщение об исключении или, по крайней мере, вы знаете, какая строка вызывает его?   -  person myaut    schedule 05.03.2015
comment
Когда я сохраняю перехваченное исключение в файл журнала, он говорит [Ошибка 9] Неверный файловый дескриптор. Я только что обновил код предложения exclude, чтобы увидеть, даст ли он мне номер строки в следующий раз, когда это произойдет, но тот факт, что один файл создается, а другой нет, предполагает, что это происходит где-то между fp.close( ) и f = открытые(...) строки.   -  person CCKx    schedule 05.03.2015
comment
Используйте модуль трассировки, чтобы получить весь стек ошибок.   -  person myaut    schedule 05.03.2015
comment
Мне не очень повезло с модулем трассировки, но я попытался получить номер строки с помощью sys.exc_info()[-1].tb_lineno, и он выдавал мне различные строки, в которых есть только операторы печати. FWIW, я сохраняю его как файл .pyw и использую pythonw.exe для его запуска.   -  person CCKx    schedule 30.03.2015


Ответы (1)


Я столкнулся с прерывистой ошибкой неверного дескриптора в сценарии, запущенном с pywin32 (запуск python в качестве службы Windows). Почти идентичный скрипт (без шаблона pywin32) работает без проблем в cmd. Трассировка модуля также указывает на различные операторы печати, поэтому я закомментировал все операторы печати, и это работает!

Пожалуйста, поправьте меня, если я ошибаюсь, я подозреваю, что это как-то связано с отсутствием stdout. Раньше я использовал операторы печати для отладки, но после этого переключился на модуль ведения журнала.

person saubao    schedule 02.10.2015
comment
Отвечать на вопросы следует только в том случае, если вы уверены. - person Leonid Glanz; 02.10.2015
comment
@LeonidGlanz Это не совсем так, так как трудно быть уверенным. В этом случае у saubao есть все основания видеть связь между их проблемой и ОП. - person SuperBiasedMan; 02.10.2015
comment
@LeonidGlanz Это правда, я не уверен. Я хотел опубликовать это как комментарий, но не смог, так как для этого мне нужно было 50 репутации. - person saubao; 04.10.2015