C ++和Python-检查PyObject类型失败

时间:2013-02-26 07:33:31

标签: 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_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会在控制台中打印返回的值。真的很烦人。

2 个答案:

答案 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