2017-02-03 30 views
0

pybind11을 사용하여 Python을 임베드했습니다. 퍼가기는 확장자보다 훨씬 덜주의되어 유용한 자료를 찾기가 어렵습니다.pybind11을 사용하여 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; 
} 

의 모든 것이 잘 보였다. 그것으로, 나는 잘못되었다.

하나의 추측은 어떻게 든 파이썬에서 사용되지 않은kwargs, decref 또는 을 삭제해야한다는 것입니다.

모든 포인터가 감사하겠습니다.

+0

이 문제는'kwargs'가 사용되지 않았기 때문에 발생했습니다. 다른 경우에는'kwargs'를 만들고 파이썬 함수를 호출하는데 사용합니다. 분할 오류가 여전히 발생합니다. – 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