Я пишу встроенный интерпретатор Python, есть функция PyErr_Print()
(https://docs.python.org/3/c-api/exceptions.html), который записывает в стандартный текст ошибки, объясняющий, почему вызванная мною C функция не удалась.
Похоже, что это не работает в Windows, так как никогда ничего не записывает в терминал, есть ли способ перенаправить его куда-нибудь или сохранить в виде строки, чтобы я мог это увидеть?
Вот решение, использующее 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
}