我试图使用pybind11在C ++中嵌入 Python。嵌入比扩展更少受到关注,并且很难找到有用的资源。
这是我的天真代码
#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
行,一切都很好。有了它,我就陷入了错误。
一个疯狂的猜测是我需要以某种方式删除或减去 kwargs
,这是Python没有使用的。
任何指针都表示赞赏。
答案 0 :(得分:0)
如果您不使用线程,则不需要锁。解释器初始化后,GIL就会立即生效。此外,pybind11文档声明不应使用Py_Initialize
和Py_Finalize
并使用py::scoped_interpreter
代替。