我正在学习将python代码嵌入到c ++代码中。按照How to solve the 'Segmentation fault' when hybrid programming of C & Python?中的简单示例并使用g++ main.cpp -I/usr/include/python2.7 -L/usr/lib/python2.7 -lpython2.7
编译代码并运行程序,我可以得到正确的结果。
但如果我创建一个" build"文件夹和使用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!"
的main.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 NULL\n");
}
return 0;
}
其中&#34; DIRECTORY_PATH&#34;是我的main.cpp文件和pytest.py的文件夹路径,而不是&#34; build&#34;的路径。夹
当我打印出PyImport_ImportModule的结果时,它返回0.我认为这意味着它没有得到python模型。但是我的main.cpp和python文件在同一目录下,我不知道为什么它不能得到模型...
我可以修理吗? THX!
答案 0 :(得分:1)
由我自己解决。我应该将main.cpp和pytest.py放在同一目录下,并使用PyRun_SimpleString ("import sys; sys.path.insert(0, 'DIRECTORY_PATH'");
来更改“DIRCTORY_PATH”#39;保存main.cpp和pytest.py的当前目录。 (在我使用错误的目录之前,我得到了分段错误)