2017-02-03 10 views
0

私はを埋め込みます。 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またはを削除する必要があるということです。

どのポインタも高く評価されています。

+0

問題は 'kwargs'が使用されていないためではありません。別のケースでは、私は 'kwargs'を作成し、それをPython関数を呼び出す際に使用します。セグメンテーションフォルトがまだ発生します。 – zpz

+0

「dict」に特有のものでもありません。同様の方法でタプルを作成すると、問題は解決しません。 – zpz

+0

この問題は、 'lock_python'、' unlock_python'ビジネスに関係しているようです。私がそれらをすべて取り除くと、問題はなくなりました。しかし、実際のアプリケーションはこのサンプルコードよりもはるかに関わっているので、私はロックを解除する必要があると思います。 – zpz

答えて

0

スレッドを使用しない場合は、ロックが必要ありません。あなたの通訳が初期化されるとすぐにGILが開催されます。さらに、pybind11文書にはPy_InitializePy_Finalizeを使用せず、代わりにpy::scoped_interpreterを使用すべきであると述べています。

+0

私はこの時点で積極的に取り組んでいません。後でチェックします。私はscoped_interpreterが私の質問の後に追加されたと思う。最近のpybind11のリリースでは、「PythonをC++に組み込むサポート」が追加されています。 – zpz

関連する問題