C++ C++;Python检查PyObject类型失败

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

我有点困惑。我尝试做一些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函数是返回浮点、列表还是集合,它们都返回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