Встраивание Python в C++ с использованием pybind11, ошибка сегментации
Я пытаюсь встроить Python в C++, используя pybind11. Встраивание привлекло гораздо меньше внимания, чем расширение, и полезные ресурсы найти сложно.
Вот мой наивный код
#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
линия, все выглядело хорошо. С этим я получил ошибку.
Одно дикое предположение, что мне нужно как-то удалить или decf kwargs
, который не был использован Python.
Любые указатели приветствуются.
1 ответ
Если вы не используете потоки, вам не нужны замки. GIL проводится, как только ваш переводчик инициализируется. Кроме того, документы Pybind11 утверждают, что не следует использовать Py_Initialize
а также Py_Finalize
и использовать py::scoped_interpreter
вместо.