使用 pybing11 覆盖 python 内置'print'



我正在使用pybind11将Python嵌入到c++应用程序中。我正在尝试从c++中覆盖Python内置的'print'函数。

mBuiltinsMod = py::module::import("builtins");
mBuiltinsMod.attr("print") = py::cpp_function([](py::object msg) {
std::cout << msg.cast<std::string>();
});

这成功地覆盖了'print'函数来调用cout,但它在程序退出时崩溃。崩溃发生在pybind11/embed.h:

void finalize_interpreter() {
// ...
if (internals_ptr_ptr) { // CRASH HERE
delete *internals_ptr_ptr;
*internals_ptr_ptr = nullptr;
}
}

当覆盖'print'函数来修复崩溃时,是否需要其他步骤?

成功了

首先,锁定GIL。然后,将none()赋值给print:

mBuiltinsMod.attr("print") = py::none();
#include <pybind11/pybind11.h>
namespace py = pybind11;
void my_print(py::args args) {
// Concatenate the input arguments into a single string
std::stringstream ss;
((ss << py::str(arg) << " "), ...);
// Output the concatenated string to the Python console
py::print(ss.str());
}
PYBIND11_MODULE(example, m) {
m.def("print", &my_print);
}

相关内容

  • 没有找到相关文章

最新更新