"Segmentation fault"使用 Cmake 在C++代码中运行 python 函数时

"Segmentation fault" when run python function in C++ code using Cmake

本文关键字:运行 python 函数 代码 C++ Segmentation fault 使用 Cmake      更新时间:2023-10-16

我正在学习将python代码嵌入到c ++代码中。按照C&Python混合编程时如何解决"分段错误"中的简单示例?并使用g++ main.cpp -I/usr/include/python2.7 -L/usr/lib/python2.7 -lpython2.7编译代码并运行程序,我可以得到正确的结果。

但是,如果我创建一个"构建"文件夹并使用CMake运行该程序,它仍然存在分段错误。

我的CMakeList.txt如下所示:

cmake_minimum_required(VERSION 2.8)
project ( pyTest )

if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "RELEASE")
endif()
string(ASCII 27 Esc)
set(Red "${Esc}[1;31m")
set(ColourReset "${Esc}[m")
if(CMAKE_BUILD_TYPE MATCHES "DEBUG")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -O0 -g")
MESSAGE(STATUS "${Red}BUILD TYPE: DEBUG${ColourReset}")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -O3")
MESSAGE(STATUS "${Red}BUILD TYPE: RELEASE${ColourReset}")
endif()

include_directories( include )
find_package(PythonLibs REQUIRED)
include_directories(${PYTHON_INCLUDE_DIRS})
set(SRC_LIST2 main.cpp)
add_executable( pytest ${SRC_LIST2})
target_link_libraries(pytest ${PYTHON_LIBRARIES})

为了方便起见,我在下面发布了我的代码:

pytest.py

def Hello():
    print "Hello, world!"

主.cpp

#include <Python.h>
int main()
{
Py_Initialize();
PyRun_SimpleString ("import sys; sys.path.insert(0, 'DIRECTORY_PATH'");
PyObject * pModule = NULL;
PyObject * pFunc   = NULL;
pModule = PyImport_ImportModule("pytest");
pFunc   = PyObject_GetAttrString(pModule, "Hello");
if(pFunc != NULL) {
    PyEval_CallObject(pFunc, NULL);
    Py_Finalize();
}
else {
    printf("pFunc returned NULLn");
}
return 0;
}

其中"DIRECTORY_PATH"是我的主文件和 pytest.py 的文件夹路径.cpp而不是"构建"文件夹的路径

当我打印出PyImport_ImportModule的结果时,它返回 0。我认为这意味着它没有得到python模型。但是我的主.cpp和python文件在同一个目录下,我不知道为什么它无法获取模型...

我可以修复它吗?谢谢!

由我自己解决。我应该将 main.cpp 和 pytest.py 放在同一个目录下,并使用 PyRun_SimpleString ("import sys; sys.path.insert(0, 'DIRECTORY_PATH'"); 将"DIRCTORY_PATH"更改为保存 main 和 pytest.py 的当前目录.cpp。(在我使用错误的目录之前,所以我得到了分段错误)