2

我有点困惑。我正在尝试进行一些 C++ 和 Python 集成,但这并不简单。我没有使用 Boost,因为我无法让 Boost::Python 正确编译。但那是另一回事了。

目前,这是我在 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 函数返回的是浮点数、列表还是集合,它们都返回 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将字符串评估为语句。语句本身不会返回任何内容,因此您None将从PyRun_String. 而是使用Py_eval_input将字符串作为表达式求值并获得结果。

于 2013-02-26T07:58:08.113 回答
2

更改Py_single_inputPy_eval_input似乎可以解决这两个问题。

前者将字符串视为解释器循环的一部分,而后者评估单个表达式并返回一个对象。(我不确定前一种情况下的返回值是什么意思,但这不是表达式的值。)

编辑:刚刚对其进行了测试,根据下面nneonneo的回答,结果Py_single_input确实是Py_None.

于 2013-02-26T07:51:21.487 回答