2011-07-20 14 views
1

Py_CompileString()PyEval_EvalCode()を使用していくつかのPythonコードを呼び出そうとしています。それは正常に動作しますが、PythonコードにエラーPy_Finalize()が含まれている場合は、Pythonでエラーが発生した後にPy_Finalize()がクラッシュする

Py_Initialize(); 

PyObject* code = Py_CompileString("pprint('Hello World')", "", Py_file_input); 
PyObject* m = PyImport_AddModule("__main__"); 
PyObject* d = PyModule_GetDict(m); 
Py_DECREF(m); 
PyObject* r = PyEval_EvalCode(code, d, d); 
Py_DECREF(d); 
if (!r) 
    PyErr_Print(); 
Py_DECREF(code); 

Py_Finalize(); 

期待通りの出力がある:

Traceback (most recent call last): 
    File "", line 1, in <module> 
NameError: name 'pprint' is no defined 

しかし、その後Py_Finalize()への呼び出しプログラムで私は、プログラムの実行

PyObject* code = Py_CompileString("print('Hello World')", "", Py_file_input); 

に3行を変更し、細かい終了crashes.If 。何がここで間違っている?

私はGDBでプログラムを実行すると、私はこの出力を得る:

Windows: 
Program received signal SIGSEGV, Segmentation fault. 
0x1e01a030 in python32!PyType_IsSubtype() from C:\Windows\SysWOW64\python32.dll 

Linux: 
Program received signal SIGSEGV, Segmentation fault. 
0xb7ef17bb in visit_decref (op=0xb78c87ec, data=0x0) at Modules/gcmodule.c:321 
321  Modules/gcmodule.c: File or Directory not found. 
     in Modules/gcmodule.c 
+0

なぜ各手順の結果を確認していませんか? –

+0

コードに接続されていないため、m&dが変更されないと思ったので確認しませんでした。そして、これは事実です:誰もエラーを返しません。 –

答えて

5

これが失敗した理由は、実際の理由は、あなたがあまりにも早くPy_DECREFを呼んでいるということではありません。それはあなたがまったく電話しているということです!

PyImport_AddModuleはを借用してという参照を返します。つまり、実際にコントロールしていない限り、Py_DECREFに電話することは許可されていません(たとえば、Py_INCREFで参照カウントを増やすなど)。

Pythonは自動的にモジュールリファレンスをPy_Finalizeにガベージコレクションします。追加のアクションは必要ありません。

1
if (!r) { 
    PyErr_Print(); 
    PyErr_Clear(); 
} 

はエラーをクリアし、あなたが成功しPy_Finalize()を呼び出すことができるようになります。

+0

コードはまだクラッシュしません。 –

+0

'PyErr_Print();'の後の行に 'PyErr_Print(0);'を追加するとどうなりますか?それでも問題が解決しない場合は、投稿を編集して実際のクラッシュ情報を提供してください。 – agf

+0

'funcitonに引数が多すぎます 'void PyErr_Print()''。私は実際のクラッシュ情報をどのように取得するのですか?プログラムは単に "test.exeはもう動作していません"というダイアログボックスで閉じます。 –

0

私は今自分自身でエラーを見つけました。 Py_DECREF(m)は、コードを評価してエラーをチェックした後にのみ呼び出すことができます。そこで、作業プログラムがこれです:

Py_Initialize(); 

PyObject* code = Py_CompileString("pprint('Hello World')", "", Py_file_input); 
PyObject* m = PyImport_AddModule("__main__"); 
PyObject* d = PyModule_GetDict(m); 
PyObject* r = PyEval_EvalCode(code, d, d); 
Py_DECREF(d); 
if (!r) 
    PyErr_Print(); 
Py_DECREF(m); 
Py_DECREF(code); 

Py_Finalize(); 
関連する問題