Py_BuildValue和PyArg_ParseTuple Seg错误

时间:2015-11-10 13:39:18

标签: python c++

编辑:我在流程开始时错过了$.ajax({ data: {"data": data}, dataType: "json", url: 'yourURl', success: function(data){ return data; }

我在使用Py_BuildValue和PYArg_ParseTuple时遇到了一些奇怪的行为。

首先,每当我尝试构建一个整数时,我在Py_BuildValue上得到一个seg错误。 浮点数,对象或字符串不会发生这种情况。

其次,当我尝试解析一个元组时,除非我正在解析包含单个字符串的元组:“s”或单个PyObject:“O”,否则我也会遇到seg错误。 (如果我尝试解析两者,我也会遇到一个段错误:“Os”)

以下是segfault的两个例子:

Py_Initialize()

和ParseTuple的一个例子(编辑正确的buildvalue并测试api调用):

#include <Python.h>
#include <iostream>

using namespace std;

int main() {
    Py_Initialize(); // <-- Missing this
    PyObject* pString = Py_BuildValue("s", "hello"); //<- Works fine
    PyObject* pFloat = Py_BuildValue("f", 2.3); //<- Works fine

    PyObject* pInt = Py_BuildValue("i", 2); // <- Seg faults

    return 0;
}

我使用anaconda python 2.7

在RedHat上运行

我编译:

#include <Python.h>
#include <iostream>

using namespace std;

int main() {
    Py_Initialize(); // <-- Missing this
    PyObject* pFloat = Py_BuildValue("f", 2.3);
    if(!pFloat)
        cout << "Error Float" << endl;

    PyObject *pTuple = PyTuple_New(1);
    if(!pTuple)
        cout << "Error Creating Tuple" << endl;

    if(PyTuple_SetItem(pTuple, 0, pFloat)) //Returns 0 on success
        cout << "Error Set Item" << endl;

    // parse tuple items
    float f;
    if(!PyArg_ParseTuple(pTuple, "f", &f))
        PyErr_SetString(PyExc_TypeError, "invalid parameter");

    return 0;
}

使用anaconda python可能有些问题吗?我已经把问题分解为最简单的情况,我可以想出来......

1 个答案:

答案 0 :(得分:2)

我看到了几个问题。

f的{​​{1}}选项从C / C ++ Py_BuildValue构造Python float。你传递了一个字符串,而不是双字符串。

每次调用Python C-API函数后,都需要测试返回值以查看是否发生了错误。这需要在每次通话后完成。

编辑 - 还有一个问题。

将Python C-API调用嵌入到C / C ++程序中时,需要通过调用double来初始化解释器。