2017-01-13 3 views
1

Ich lerne Python-Code in C++ - Code einzubetten. Folgen Sie dem einfachen Beispiel in How to solve the 'Segmentation fault' when hybrid programming of C & Python? und verwenden Sie g++ main.cpp -I/usr/include/python2.7 -L/usr/lib/python2.7 -lpython2.7, um den Code zu kompilieren und das Programm auszuführen, kann ich das richtige Ergebnis erhalten."Segmentierungsfehler" beim Ausführen von Python-Funktion in C++ - Code mit Cmake

Aber wenn ich einen "Build" -Ordner erstellen und CMake verwenden, um das Programm auszuführen, hat es immer noch Segmentierungsfehler.

Mein CMakeList.txt ist wie unten:

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}) 

Der Einfachheit halber ich meinen Code schreiben unter:

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; 
} 

wo "DIRECTORY_ PATH“ist der Ordner Pfad meiner main.cpp-Datei und pytest.py, nicht der Weg der‚build‘-Ordner

Wenn ich das Ergebnis von PyImport_ImportModule auszudrucken, gibt es 0. Ich denke, das bedeutet, dass es nicht Holen Sie sich das Python-Modell. Aber meine main.cpp und Python-Datei sind unter demselben Verzeichnis, ich weiß nicht, warum es das Modell nicht bekommen kann ...

Kann ich es beheben? Danke!

+0

Kannst du den Fehler posten, den du bekommst? – 1N5818

+1

@Displayname Der Fehler ist nur "Segmentierungsfehler". Keine anderen Nachrichten ... Aber wenn ich das Ergebnis von PyImport_ImportModule ausdrucke, gibt es 0 zurück. Ich denke, das bedeutet, dass es das Python-Modell nicht bekommt. Aber meine main.cpp und python Datei ist unter demselben Verzeichnis, ich weiß nicht, warum es das Modell nicht bekommen kann ... –

+0

Der Name Ihres Moduls ist 'pytest', nicht' test'. Sie sollten den von 'PyImport_ImportModule' zurückgegebenen Wert überprüft haben, bevor Sie ihn verwenden. – DyZ

Antwort

1

Gelöst von mir. Ich sollte main.cpp und pytest.py unter dasselbe Verzeichnis setzen und PyRun_SimpleString ("import sys; sys.path.insert(0, 'DIRECTORY_PATH'"); verwenden, um 'DIRCTORY_PATH' in das aktuelle Verzeichnis zu ändern, das main.cpp und pytest.py speichert. (Bevor ich ein falsches Verzeichnis verwendet habe, habe ich einen Segmentierungsfehler bekommen)

Verwandte Themen