Как я могу получить вывод PyErr_Print в Windows или сохранить его в виде строки

Я пишу встроенный интерпретатор Python, есть функция PyErr_Print() (https://docs.python.org/3/c-api/exceptions.html), который записывает в стандартный текст ошибки, объясняющий, почему вызванная мною C функция не удалась.

Похоже, что это не работает в Windows, так как никогда ничего не записывает в терминал, есть ли способ перенаправить его куда-нибудь или сохранить в виде строки, чтобы я мог это увидеть?

1

Решение

Вот решение, использующее boost :: python:

#include <ostream>
#include <boost/python.hpp>

std::ostream& operator<<(std::ostream& os, boost::python::error_already_set& e) {
using namespace boost::python;
// acquire the Global Interpreter Lock

PyObject * extype, * value, * traceback;
PyErr_Fetch(&extype, &value, &traceback);
if (!extype) return os;

object o_extype(handle<>(borrowed(extype)));
object o_value(handle<>(borrowed(value)));
object o_traceback(handle<>(borrowed(traceback)));

object mod_traceback = import("traceback");
object lines = mod_traceback.attr("format_exception")(
o_extype, o_value, o_traceback);

for (int i = 0; i < len(lines); ++i)
os << extract<std::string>(lines[i])();

// PyErr_Fetch clears the error state, uncomment
// the following line to restore the error state:
// PyErr_Restore(extype, value, traceback);

// release the GIL
return os;
}

Используйте как это:

#include <iostream>
#include <boost/python.hpp>

try {
// some code that raises
catch (boost::python::error_already_set& e) {
std::cout << e << std::endl; // or stream to somewhere else
}
2

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


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