gpt4 book ai didi

python - Py_BuildValue 和 PyArg_ParseTuple 段错误

转载 作者:搜寻专家 更新时间:2023-10-31 02:19:18 25 4
gpt4 key购买 nike

编辑:我在流程开始时遗漏了 Py_Initialize()

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

首先,每当我尝试构建一个整数时,我都会在 Py_BuildValue 处遇到段错误。这不会发生在 float 、对象或字符串上。

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

这里有两个段错误的例子:

#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;
}

和一个 ParseTuple 示例(为正确的构建值和 api 调用测试而编辑):

#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;
}

我在 RedHat 上运行 anaconda python 2.7

我编译:

g++ `python-config --cflags` -L/home/user/anaconda/lib/ -lpython2.7 test.cpp -o test.out

使用 anaconda python 可能有问题吗?我已将问题分解为我能想到的最简单的情况...

最佳答案

我看到了几个问题。

Py_BuildValuef 选项从 C/C++ double 构造一个 Python float 。你传递了一个字符串,而不是一个 double 。

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

编辑 - 又一期。

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

关于python - Py_BuildValue 和 PyArg_ParseTuple 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33631353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com