Встраивание 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 вместо.

Другие вопросы по тегам