我有点困惑。我正在尝试进行一些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会在控制台中打印返回的值。真的很烦人。
答案 0 :(得分:3)
来自the docs:
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
来将字符串计算为表达式并获得结果。
答案 1 :(得分:2)
将Py_single_input
更改为Py_eval_input
似乎可以解决这两个问题。
前者将字符串视为解释器循环的一部分,而后者则评估单个表达式并返回一个对象。 (我不确定返回值在前一种情况下意味着什么,但它不是表达式的值。)
编辑:刚刚测试过,根据 nneonneo 的答案,Py_single_input
的结果确实是Py_None
。