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 또는 을 삭제해야한다는 것입니다.
모든 포인터가 감사하겠습니다.
이 문제는'kwargs'가 사용되지 않았기 때문에 발생했습니다. 다른 경우에는'kwargs'를 만들고 파이썬 함수를 호출하는데 사용합니다. 분할 오류가 여전히 발생합니다. – zpz
"dict"에만 해당되는 것도 아닙니다. 유사한 방식으로 튜플을 생성하면 문제가 지속됩니다. – zpz
이 문제는'lock_python','unlock_python' 비즈니스와 관련이있는 것으로 보입니다. 내가 그들을 모두 제거하면 문제는 없어집니다. 그러나 실제 응용 프로그램이이 예제 코드보다 훨씬 더 복잡하기 때문에 자물쇠 잠금 해제가 필요하다고 생각합니다. – zpz