使用pybind11,Segmentation fault在C ++中嵌入Python

时间:2017-02-03 03:55:15

标签: python c++ embedding pybind11

我试图使用pybind11在C ++中嵌入 Python。嵌入比扩展更少受到关注,并且很难找到有用的资源。

这是我的天真代码

#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行,一切都很好。有了它,我就陷入了错误。

一个疯狂的猜测是我需要以某种方式删除减去 kwargs,这是Python没有使用的。

任何指针都表示赞赏。

1 个答案:

答案 0 :(得分:0)

如果您不使用线程,则不需要锁。解释器初始化后,GIL就会立即生效。此外,pybind11文档声明不应使用Py_InitializePy_Finalize并使用py::scoped_interpreter代替。