У меня возникли проблемы с выяснением надлежащего способа отслеживания трассировки Python с использованием C API. Я пишу приложение, в которое встроен интерпретатор Python. Я хочу, чтобы иметь возможность выполнять произвольный код Python, и если он вызывает исключение, перевести его на мое собственное исключение С++ для конкретного приложения. На данный момент достаточно извлечь только имя файла и номер строки, где было вызвано исключение 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
, которая выглядит как частная структура. Моя следующая идея заключалась в программной загрузке модуля "traceback" Python и вызове его функций с помощью API C. Это здорово? Есть ли лучший способ получить доступ к трассировке Python из C?