0

我正在尝试使用 pybind11 将 Python嵌入到 C++ 中。Embedding 比extension受到的关注要少得多,而且有用的资源也很难找到。

这是我天真的代码

#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条线,一切看起来都很好。有了它,我就犯了错误。

一个疯狂的猜测是我需要以某种方式deletedecref kwargs,Python 没有使用它。

任何指针表示赞赏。

4

1 回答 1

0

如果您不使用线程,则不需要锁。GIL 会在您的解释器初始化后立即保存。此外,pybind11 文档指出不应使用Py_Initializeand而是Py_Finalize使用 the py::scoped_interpreter

于 2017-11-15T14:09:21.907 回答