2

私は少し混乱しています。C++ と Python の統合を試みていますが、簡単ではありません。Boost::Python を正しくコンパイルできなかったため、Boost を使用していません。しかし、それは別の話です。

現在、C ++で行っていることは次のとおりです。

//set everything up
PyObject* py_main_module = PyImport_AddModule("__main__");
PyObject* py_global_dict = PyModule_GetDict(py_main_module);
PyObject* py_local_dict = PyDict_New();
PyObject* py_return_value;

PyRun_SimpleString(data.c_str()); //runs Python code, which defines functions

//call a function defined by the python code
py_return_value = PyRun_String("test()", Py_single_input, py_global_dict, py_local_dict);

//attempt to check the type of the returned value
if(py_return_value != NULL) {
    //this is the problem: all of these print 0
    cout << PyList_Check(py_return_value) << endl;
    cout << PySet_Check(py_return_value) << endl;
    cout << PyFloat_Check(py_return_value) << endl;
} else {
    cout << "IT WAS NULL?!" << endl;
}

Python プログラム (「data」という名前の文字列として C++ プログラムに入力):

def test():
    derp = 1.234
    #derp = [1, 2, 3, 4]
    #derp = set([1, 2, 3, 4])
    return derp

問題は、型チェックが機能していないことです。Python 関数が float、list、または set を返すかどうかに関係なく、それらはすべて 0 を返します。私は何を間違っていますか?

PyRun_String の呼び出しがコンソールに戻り値を出力する理由を誰かが教えてくれればボーナスポイントです。それは本当に迷惑です。

4

2 に答える 2

3

ドキュメントから:

int Py_eval_input

孤立した式の Python 文法の開始記号。で使用しPy_CompileString()ます。

int Py_file_input

ファイルまたは他のソースから読み取られた一連のステートメントの Python 文法の開始記号。で使用し Py_CompileString()ます。これは、任意の長さの Python ソース コードをコンパイルするときに使用するシンボルです。

int Py_single_input

単一ステートメントの Python 文法からの開始記号。で使用しPy_CompileString()ます。これは、対話型インタープリター ループに使用されるシンボルです。

Py_single_input文字列をstatementとして評価します。ステートメントは本質的に何も返さないため、Noneから戻りますPyRun_StringPy_eval_input代わりに使用して、文字列を式として評価し、結果を取得します。

于 2013-02-26T07:58:08.113 に答える
2

に変更Py_single_inputするPy_eval_inputと、両方の問題が解決するようです。

前者は文字列をインタプリタ ループの一部として扱いますが、後者は単一の式を評価してオブジェクトを返します。(前者の場合、戻り値が何を意味するのかわかりませんが、式の値ではありません。)

編集:それをテストしたところ、以下のnneonneoの回答に従って、結果Py_single_inputは実際にはPy_None.

于 2013-02-26T07:51:21.487 に答える