Boost.Python генерирует исключение при печати трассировки

Среда: 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;
}
  1. Эта линия, кажется, вызывает проблему. Заменить его на
object lines = import("traceback").attr("format_exc")();

кажется, решил проблему, но результат не является следом.

  1. Я попытался закомментировать эту строку, и ничего не изменилось.

Я также пытался заменить 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;
}

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]