Запись ошибок питонов в текстовый файл - PullRequest
1 голос
/ 25 января 2010

У меня проблемы с тем, чтобы заставить это работать правильно (очевидно) - я ПОЧТИ там, и у меня есть хорошее представление, ПОЧЕМУ это не работает - просто не уверен, как заставить это работать.

Предполагается, что вы пытаетесь прочитать файл в память, и в случае неудачи он переходит к предложению «кроме» блока кода (эта часть - «Дух»). Файл ошибки печатает: «<<strong> main .DebugOutput экземпляр в 0x04021EB8>». То, что я хочу сделать, это распечатать фактическую ошибку. Например, FileIOError или TraceBackError или что-то еще в этом файле ошибок. Это только начальные этапы, и я планирую добавить такие вещи, как отметки даты и добавить их, а не писать / создавать - мне просто нужна фактическая ошибка, напечатанная в файле. Совет

import os, sys

try:
    myPidFile = "Zeznadata.txt"
    myOpenPID_File = open(myPidFile, "r") #Attempts to open the file
    print "Sucessfully opened the file: \"" + myPidFile + "\"."

except:
    print "This file, \"" + myPidFile + "\", does not exist.  Please check the file name and try again.  "
    myFileErr = open("PIDErrorlog.txt", "w")
    myStdError = str(sys.stderr)
    myFileErr.write(myStdError)
    myFileErr.close()
    print "\nThis error was logged in the file (and stored in the directory): "

Ответы [ 4 ]

7 голосов
/ 25 января 2010

Во-первых, вы должны использовать библиотеку журналов. Это поможет вам справиться с различными уровнями ведения журнала (информация / предупреждение / ошибка), временными метками и т. Д.

http://docs.python.org/library/logging.html

Во-вторых, вам нужно поймать ошибку, а затем вы можете записать подробности об этом. Этот пример взят из документации по Python.

import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())

except IOError as (errno, strerror):
    print "I/O error({0}): {1}".format(errno, strerror)
except ValueError:
    print "Could not convert data to an integer."
except:
    print "Unexpected error:", sys.exc_info()[0]
    raise

Посмотрите, как он ловит IOError и назначает номер ошибки и сообщение об ошибке переменным? Вы можете иметь блок except для каждого типа ошибки, с которой вы хотите иметь дело. В последнем блоке (общая ошибка) для получения сведений об ошибке используется sys.exc_info()[0].

http://docs.python.org/tutorial/errors.html

3 голосов
/ 25 января 2010

проблема здесь:

 myStdError = str(sys.stderr)
 myFileErr.write(myStdError)

sys.stderr - это файловый интерфейс, определенный в стандартах POSIX, который называется стандартная ошибка , а не «текст ошибки», который можно записать в файл. Итак, что вы (вероятно) хотели сделать, это:

sys.stderr = myFileErr

Это Python, эквивалентный python your_python_sctipt.py 2> PIDErrorLog.txt в оболочке Unix.

1 голос
/ 25 января 2010

Используйте модуль регистрации. В модуле регистрации есть средства форматирования исключений, которые помогут вам красиво распечатать исключения.

http://docs.python.org/library/logging.html

0 голосов
/ 25 января 2010

Как говорит Кимвайс, ваша проблема:

myStdError = str(sys.stderr)
myFileErr.write(myStdError)

sys.stderr - это дескриптор файла для stderr (stdout - это то, что пишет в print).

Вы должны сделать что-то вроде:

try:
    ...open file...
except IOError as (errno, strerror):
    ...open errfile...
    errfile.write(strerror)
    errfile.close()

Ответ Элисон также очень хорош и хорошо написан.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...