встраивание 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 линия, все выглядело хорошо. С этим я получил ошибку.

Одно дикое предположение, что мне нужно как-то удалять или же decref kwargs, который не был использован Python.

Любые указатели приветствуются.

0

Решение

Если вы не используете потоки, вам не нужны замки. GIL проводится, как только ваш переводчик инициализируется. Кроме того, документы Pybind11 утверждают, что не следует использовать Py_Initialize а также Py_Finalize и использовать py::scoped_interpreter вместо.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]