【发布时间】: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 行,一切看起来都很好。有了它,我就犯了错误。
一个疯狂的猜测是我需要以某种方式 delete 或 decref kwargs,Python 没有使用它。
任何指针表示赞赏。
【问题讨论】:
-
问题不是因为没有使用
kwargs。在另一种情况下,我创建了一个kwargs并在调用 Python 函数时使用它。分段错误仍然发生。 -
既不是特定于
dict。如果我以类似的方式创建一个元组,问题仍然存在。 -
该问题似乎与
lock_python、unlock_python业务有关。如果我将它们全部删除,问题就消失了。但是我认为我需要锁定解锁,因为我的实际应用程序肯定比这个示例代码涉及更多。
标签: python c++ embedding pybind11