【问题标题】:embedding Python in C++ using pybind11, Segmentation fault使用 pybind11 在 C++ 中嵌入 Python,分段错误
【发布时间】:2017-02-03 03:55:14
【问题描述】:

我正在尝试使用 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 行,一切看起来都很好。有了它,我就犯了错误。

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

任何指针表示赞赏。

【问题讨论】:

  • 问题不是因为没有使用kwargs。在另一种情况下,我创建了一个 kwargs 并在调用 Python 函数时使用它。分段错误仍然发生。
  • 既不是特定于dict。如果我以类似的方式创建一个元组,问题仍然存在。
  • 该问题似乎与lock_pythonunlock_python 业务有关。如果我将它们全部删除,问题就消失了。但是我认为我需要锁定解锁,因为我的实际应用程序肯定比这个示例代码涉及更多。

标签: python c++ embedding pybind11


【解决方案1】:

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

【讨论】:

  • 我现在没有积极处理这个问题。稍后会检查。我认为在我的问题之后添加了“scoped_interpreter”。最近的 pybind11 版本声明他们添加了“在 C++ 中嵌入 Python 的支持”,这对我来说听起来非常鼓舞人心,尽管在该版本之前嵌入肯定是可能的。
猜你喜欢
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 2021-03-28
相关资源
最近更新 更多