2016-10-14 8 views
0

Pythonを使用して自分の関数で数学的なテストを行いたいと思います。 Pythonのへのアクセスを得ることができ、典型的なプログラムはこれです:Python Cの拡張機能:エンジンからのパラメータの抽出

#include <iostream> 
#include <string> 
#include <Python.h> 
int RunTests() 
{ 
    Py_Initialize(); 

    PyRun_SimpleString("a=5"); 
    PyRun_SimpleString("b='Hello'"); 
    PyRun_SimpleString("c=1+2j"); 
    PyRun_SimpleString("d=[1,3,5,7,9]"); 

    //question here 

    Py_Finalize(); 
    return 0; 
} 

私の質問は:どのように私はパラメータa,b,c,dPyObject秒を抽出することができますか?

答えて

1

PyRun_SimpleString()は、__main__モジュールのコンテキストでコードを実行します。あなたがこのモジュールとルックアップ変数からグローバル辞書を取得、PyImport_AddModule()を使用して、このモジュールへの参照を取得することができます

PyObject *main = PyImport_AddModule("__main__"); 
PyObject *globals = PyModule_GetDict(main); 
PyObject *a = PyDict_GetItemString(globals, "a"); 

をする代わりに、このアプローチを使用して、新しいglobals辞書を作成し、実行するためにPyRun_String()を使用したほうが良いかもしれませんそのglobals辞書のコンテキストでコード:

PyObject *globals = PyDict_New(); 
PyObject *a = PyRun_String("5", Py_single_input, globals, globals); 

この方法では、まず、いくつかの変数にあなたの式の結果を格納し、__main__のグローバルスコープからそれを抽出する必要はありません。中間結果を格納するために変数を使用することはできますが、上記のようにglobalsから抽出することができます。

+0

これは、デバッグ時に 'a'にSIGSEGV - セグメンテーション違反例外をスローしています。これ以外にも私は何をすべきですか? –

+0

'PyEval_GetLocals'が' NULL'を返していることがわかりました!理由を知っていますか?エンジンは、私が提供したコードに従って動作しています。 –

+0

すみません。あなたのコードは動作しません。 http://stackoverflow.com/questions/40046330/python-c-extension-pyeval-getlocals-returns-null –

関連する問題