2015-03-05 4 views
0

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

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 дескриптор файла"), письмо не помечено для удаления и остается на сервере до тех пор, пока сохраненное вложение не будет удалено или не перемещено, после чего оба файла будут сохранены без каких-либо ошибок ,

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

+0

У вас есть полное сообщение об исключении или, по крайней мере, вы знаете, какая строка вызывает его? – myaut

+0

Когда я сохраняю застигнутое исключение в файле журнала, он говорит: «[Ошибка 9] Плохой дескриптор файла». Я только что обновил код except except, чтобы увидеть, даст ли он номер строки в следующий раз, но тот факт, что один файл создается, а другой не говорит мне, что это происходит где-то между fp.close () и f = открытые (...) линии. – CCKx

+0

Используйте модуль трассировки, чтобы получить всю совокупность ошибок. – myaut

ответ

1

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

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

+0

Вы должны отвечать на вопросы только в том случае, если вы уверены. –

+0

@LeonidGlanz Это не совсем верно, так как трудно быть уверенным. В этом случае у Saubao есть все основания видеть связь между их проблемой и OP. – SuperBiasedMan

+1

@LeonidGlanz Это правда, я не уверен. Я хотел опубликовать это как комментарий, но не мог, поскольку мне нужна была 50 репутация, чтобы сделать это. – saubao

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