Python C API: как получить строковое представление исключения?
-
05-07-2019 - |
Вопрос
Если я это сделаю (например)
open("/snafu/fnord")
в Python (а файл не существует) я получаю трассировку и сообщение
IOError: [Errno 2] No such file or directory: '/snafu/fnord'
Я хотел бы получить приведенную выше строку с помощью Python C API (то есть интерпретатор Python, встроенный в программу C). Мне нужно это как строка, а не вывод на консоль.
С помощью PyErr_Fetch ()
я могу получить объект типа исключения и значение. Для приведенного выше примера значение является кортежем:
(2, 'No such file or directory', '/snafu/fnord')
Есть ли простой путь от информации, которую я получаю из PyErr_Fetch ()
к строке, которую показывает интерпретатор Python? (Тот, который не требует создания таких строк для каждого типа исключения самостоятельно.)
Решение
Я думаю, что исключения Python выводятся с помощью команды " str () " в экземпляре исключения, который вернет интересующую вас отформатированную строку. Вы можете получить это из C, вызвав PyObject_Str ()
описанный здесь метод:
https://docs.python.org/c-api/object.html р>
Удачи!
Обновление . Я немного запутался, почему второй элемент, возвращаемый вам PyErr_Fetch ()
, является строкой. Я предполагаю, что вы получаете "ненормализованное исключение" и нужно вызвать PyErr_NormalizeException ()
, чтобы превратить этот кортеж в " реальный " Исключение, которое может отформатировать себя как строку, как вы хотите.