2017-01-13 6 views
1

私は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を使用すると、正しい結果が得られます。Cmakeを使ってC++コードでPython関数を実行すると "Segmentation fault"

私は "ビルド"フォルダを作成し、CMakeを使用してプログラムを実行すると、まだセグメント化エラーが発生しています。

マイCMakeList.txtは以下のようなものです:

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; 
} 
:便宜上

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

、私は以下の私のコードを投稿します

ここで、 "DIRECTORY_ PATH "は私のmain.cppファイルとpytest.pyのフォルダパスです。" build "フォルダのパスではありません。

PyImport_ImportModuleの結果をプリントアウトすると0が返されます。 Pythonモデルを入手してください。しかし、私のmain.cppとpythonファイルは同じディレクトリの下にありますが、なぜそれがモデルを取得できないのか分かりません...

私はそれを修正できますか?どうも!

+0

エラーが表示されますか? – 1N5818

+1

@Displaynameエラーは単なる「セグメンテーションフォールト」です。その他のメッセージはありません...しかし、PyImport_ImportModuleの結果をプリントアウトすると、0が返されます。これはPythonモデルを取得しないことを意味します。しかし、私のmain.cppとpythonファイルは同じディレクトリの下にありますが、私はなぜモデルを手に入れることができないのかわかりません。 –

+0

あなたのモジュールの名前は 'test'ではなく' pytest'です。 'PyImport_ImportModule'が返す値をチェックする必要があります。 – DyZ

答えて

1

自分で解決しました。 main.cppとpytest.pyを同じディレクトリに置き、PyRun_SimpleString ("import sys; sys.path.insert(0, 'DIRECTORY_PATH'");を使って、 'DIRCTORY_PATH'をmain.cppとpytest.pyを保存するカレントディレクトリに変更してください。 (間違ったディレクトリを使用する前にセグメント違反が発生しました)

関連する問題