У меня возникли проблемы с поиском правильного способа выполнения обратной трассировки Python с использованием C API. Я пишу приложение, в которое встроен интерпретатор Python. Я хочу иметь возможность выполнять произвольный код Python и, если он вызывает исключение, преобразовать его в мое собственное исключение C++ для конкретного приложения. На данный момент достаточно извлечь только имя файла и номер строки, в которой возникло исключение Python. Вот что у меня есть на данный момент:
Код: Выделить всё
PyObject* pyresult = PyObject_CallObject(someCallablePythonObject, someArgs);
if (!pyresult)
{
PyObject* excType, *excValue, *excTraceback;
PyErr_Fetch(&excType, &excValue, &excTraceback);
PyErr_NormalizeException(&excType, &excValue, &excTraceback);
PyTracebackObject* traceback = (PyTracebackObject*)traceback;
// Advance to the last frame (python puts the most-recent call at the end)
while (traceback->tb_next != NULL)
traceback = traceback->tb_next;
// At this point I have access to the line number via traceback->tb_lineno,
// but where do I get the file name from?
// ...
}
Покопавшись в исходном коде Python, я увидел, что они получают доступ как к имени файла, так и к имени модуля текущего кадра через структуру _frame, которая выглядит так: является частной структурой. Моя следующая идея заключалась в том, чтобы программно загрузить модуль трассировки Python и вызвать его функции с помощью C API. Это разумно? Есть ли лучший способ получить доступ к обратной трассировке Python из C?
Подробнее здесь:
https://stackoverflow.com/questions/179 ... -the-c-api