2012-03-22 9 views
4

:その後、C&Pythonのハイブリッドプログラミングで 'セグメンテーションフォールト'を解決するには?私のUbuntuの下

$猫test.py

#Filename test.py 
def Hello(): 
    print "Hello, world!" 

$猫tom.cpp

#include <Python.h> 

int main() 
{ 
    Py_Initialize(); 

    PyObject * pModule = NULL; 
    PyObject * pFunc = NULL; 

    pModule = PyImport_ImportModule("test"); 
    pFunc = PyObject_GetAttrString(pModule, "Hello"); 
    PyEval_CallObject(pFunc, NULL); 

    Py_Finalize(); 

    return 0; 
} 

そして、それをコンパイルします。

g++ tom.cpp -I/usr/include/python2.7 -L/usr/lib/python2.7 -lpython2.7 

ラン: $ ./a.out

Segmentation fault 

なぜですか? 助けてもらえますか? ありがとう!

BR、 トム

+6

デバッガを使用してください。 – Marcin

答えて

4

私のコメントは、より「一般的」であるように、以前のポスターは、おそらく正しいです...しかし、C/C++で、あなたはそれがありません確認せずにバック関数からポインタを受け入れるべきではありませんそれをデフレクションしようとする前にNULLを返します。上記のコードはより適切になるはずです:

pModule = PyImport_ImportModule("test"); 
if (pModule == NULL) { 
    printf("ERROR importing module"); 
    exit(-1); 
    } 
pFunc = PyObject_GetAttrString(pModule, "Hello"); 
if (pFunc == NULL) { 
    printf("ERROR getting Hello attribute"); 
    exit(-1); 
    } 
PyEval_CallObject(pFunc, NULL); 
+0

ありがとう!良い習慣! – user866735

4

この問題はPyObject_GetAttrStringがNULLを返すことによって発生します。私はPyRun_SimpleStringを使用してディレクトリパスを追加しました。私のdevディレクトリはPythonパスの下にありませんでした。

#include <Python.h> 

int main() 
{ 

    Py_Initialize(); 
    PyRun_SimpleString ("import sys; sys.path.insert(0, 'add the directory path here')"); 
    PyObject * pModule = NULL; 
    PyObject * pFunc = NULL; 

    pModule = PyImport_ImportModule("test"); 
    pFunc = PyObject_GetAttrString(pModule, "Hello"); 
    if(pFunc != NULL) { 
     PyEval_CallObject(pFunc, NULL); 
     Py_Finalize(); 
    } 
    else { 
     printf("pFunc returned NULL\n"); 
    } 

    return 0; 
} 
+0

ありがとうございます!これは動作します! – user866735

+0

@snibuまずあなたのanswareに感謝しますが、このコードとすべてのpythonとC++ファイルを同じフォルダに使用していますが、まだセグメントの障害はありますか?私を助けることができますか? –

関連する問題