私は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ファイルは同じディレクトリの下にありますが、なぜそれがモデルを取得できないのか分かりません...
私はそれを修正できますか?どうも!
エラーが表示されますか? – 1N5818
@Displaynameエラーは単なる「セグメンテーションフォールト」です。その他のメッセージはありません...しかし、PyImport_ImportModuleの結果をプリントアウトすると、0が返されます。これはPythonモデルを取得しないことを意味します。しかし、私のmain.cppとpythonファイルは同じディレクトリの下にありますが、私はなぜモデルを手に入れることができないのかわかりません。 –
あなたのモジュールの名前は 'test'ではなく' pytest'です。 'PyImport_ImportModule'が返す値をチェックする必要があります。 – DyZ