[英]embedding Python in C++ using pybind11, Segmentation fault
我正在尝试使用pybind11 将 Python 嵌入 C ++中。 嵌入的注意要比扩展少得多,并且很难找到有用的资源。
这是我的天真代码
#include "Python.h"
#include "pybind11/pybind11.h"
#include <iostream>
namespace py = pybind11;
void lock_python(PyThreadState* s)
{
PyEval_RestoreThread(s);
}
PyThreadState* unlock_python()
{
return PyEval_SaveThread();
}
void run(PyThreadState * _py_thread_state)
{
if (_py_thread_state) {
lock_python(_py_thread_state);
}
py::object np = py::module::import("numpy");
auto v = np.attr("sqrt")(py::cast(36.0));
std::cout << "sqrt(36.0) = " << v.cast<double>() << std::endl;
py::dict kwargs = py::dict(py::arg("a") = 3);
if (_py_thread_state) {
_py_thread_state = unlock_python();
}
}
int main()
{
Py_Initialize();
PyEval_InitThreads();
PyThreadState * _py_thread_state = unlock_python();
run(_py_thread_state);
if (_py_thread_state) {
lock_python(_py_thread_state);
delete _py_thread_state;
}
return 0;
}
没有kwargs
线,一切看起来都很好。 有了它,我遇到了故障。
一个疯狂的猜测是,我需要以某种方式删除或拒绝ref kwargs
,而Python并未使用。
任何指针表示赞赏。
如果不使用线程,则不需要锁。 解释程序初始化后,将立即保留GIL。 pybind11文档进一步指出,不应使用Py_Initialize
和Py_Finalize
而应使用py::scoped_interpreter
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.