繁体   English   中英

使用pybind11将Python嵌入C ++中,出现分段错误

[英]embedding Python in C++ using pybind11, Segmentation fault

我正在尝试使用pybind11 Python 嵌入 C ++中。 嵌入的注意要比扩展少得多,并且很难找到有用的资源。

这是我的天真代码

#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线,一切看起来都很好。 有了它,我遇到了故障。

一个疯狂的猜测是,我需要以某种方式删除拒绝ref kwargs ,而Python并未使用。

任何指针表示赞赏。

如果不使用线程,则不需要锁。 解释程序初始化后,将立即保留GIL。 pybind11文档进一步指出,不应使用Py_InitializePy_Finalize而应使用py::scoped_interpreter

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM