C++ C++;Python检查PyObject类型失败
我有点困惑。我尝试做一些C++和Python集成,但它不太简单。我没有使用Boost,因为我无法正确编译Boost::Python。但那是另一个故事 目前,我正在用C++做以下工作:C++ C++;Python检查PyObject类型失败,c++,python,pyobject,C++,Python,Pyobject,我有点困惑。我尝试做一些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
//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函数是返回浮点、列表还是集合,它们都返回0。我做错了什么
如果有人能告诉我为什么对PyRun_字符串的调用会在控制台中打印返回值,那么就可以获得额外的积分。这真的很烦人。将
Py_single_input
更改为Py_eval_input
似乎可以解决这两个问题
前者将字符串视为解释器循环的一部分,而后者计算单个表达式并返回一个对象。(我不确定返回值在前一种情况下的含义,但它不是表达式的值。)
编辑:刚刚测试过它,根据下面的NNONNEO的回答,Py_single_input
的结果确实是Py_None
来自:
int Py\u eval\u输入
Python语法中独立表达式的开始符号;用于Py\u CompileString()
int Py\u文件输入
Python语法中从文件或其他源读取的语句序列的开始符号;用于
Py\u CompileString()
。这是编译时要使用的符号
任意长的Python源代码
int Py\u单输入
Python语法中单个语句的开始符号;用于Py\u CompileString()
。这是用于显示的符号
交互式解释器循环
Py_single_input
将字符串作为语句进行计算。语句本身不会返回任何内容,因此您将从PyRun\u String
返回None
。使用Py\u eval\u input
将字符串作为表达式求值并得到结果。谢谢!这确实解决了我的两个问题。除了返回值之外,作为语句或表达式进行计算有什么区别?或者这是唯一的区别?表达式可以产生值;例如x-1
,foo(blah)
,lambda x:y
。语句是Python中常见的代码行,包括赋值x=1
和函数定义。表达式本身可以是语句,但并非所有语句都可以被视为表达式。(可以将表达式视为可以传递给函数的任何内容)。
def test():
derp = 1.234
#derp = [1, 2, 3, 4]
#derp = set([1, 2, 3, 4])
return derp