Я пытаюсь встраивать 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.
Любые указатели приветствуются.
Если вы не используете потоки, вам не нужны замки. GIL проводится, как только ваш переводчик инициализируется. Кроме того, документы Pybind11 утверждают, что не следует использовать Py_Initialize
а также Py_Finalize
и использовать py::scoped_interpreter
вместо.
Других решений пока нет …