私はを埋め込みます。 Pythonはpybind11を使用しています。埋め込みはの内線番号よりもはるかに注意を払っておらず、役立つリソースは見つけにくいです。pybind11を使用してPythonをC++に埋め込むと、セグメンテーションフォールト
はここに私の素朴なコードkwargs
ラインなし
#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;
}
だ、すべてが正常に見えました。それで、私はセットフォルトを得ました。
一つの野生の推測では、私が何とかは、Pythonで使用されなかったkwargs
、decrefまたはを削除する必要があるということです。
どのポインタも高く評価されています。
問題は 'kwargs'が使用されていないためではありません。別のケースでは、私は 'kwargs'を作成し、それをPython関数を呼び出す際に使用します。セグメンテーションフォルトがまだ発生します。 – zpz
「dict」に特有のものでもありません。同様の方法でタプルを作成すると、問題は解決しません。 – zpz
この問題は、 'lock_python'、' unlock_python'ビジネスに関係しているようです。私がそれらをすべて取り除くと、問題はなくなりました。しかし、実際のアプリケーションはこのサンプルコードよりもはるかに関わっているので、私はロックを解除する必要があると思います。 – zpz