Среда: Python 3.5 и Boost 1.61.
У меня есть функция, которая печатает трассировку Python. Он опирается на следующий механизм:
traceback.format_exception(exType, value, traceBack);
Это сама функция:
std::string pythonTraceBack()
{
using namespace boost::python;
PyObject* exType;
PyObject* value;
PyObject* traceBack;
PyErr_Fetch(&exType, &value, &traceBack);
object oExType(handle<>(borrowed(exType)));
object oValue(handle<>(borrowed(value)));
object oTraceBack(handle<>(borrowed(traceBack)));
// 1.
object lines = import("traceback").attr("format_exception")(oExType, oValue, oTraceBack);
std::string result;
for (int i = 0; i < len(lines); ++i)
result += extract<std::string>(lines[i])();
// 2.
PyErr_Restore(exType, value, traceBack);
return result;
}
object lines = import("traceback").attr("format_exc")();
кажется, решил проблему, но результат не является следом.
Я также пытался заменить oExType, oValue, oTraceBack
с их соответствующими необработанными объектами exType, value, traceBack
, но это вызывает ошибки преобразования во время компиляции.
Минимальный, Полный, Проверяемый пример:
#include <iostream>
#include <Python.h>
#include <boost/python.hpp>
std::string pythonTraceBack() { /* ... */ }
int main()
{
using namespace boost::python;
Py_Initialize();
try
{
object main_module = import("__main__");
object main_namespace = main_module.attr("__dict__");
object ignored = exec("print(1/0)", main_namespace);
}
catch (error_already_set const& e)
{
std::string error = pythonTraceBack();
std::cout << "Traceback: " << std::endl << error;
}
// Py_Finalize();
return 0;
}
Задача ещё не решена.
Других решений пока нет …