【发布时间】:2015-11-10 22:52:28
【问题描述】:
编辑:我在流程开始时错过了Py_Initialize()。
我在使用 Py_BuildValue 和 PYArg_ParseTuple 时遇到了一些奇怪的行为。
首先,每当我尝试构建一个整数时,我都会在 Py_BuildValue 处遇到一个段错误。 浮点数、对象或字符串不会发生这种情况。
其次,当我试图解析一个元组时,我也会得到一个段错误,除非我正在解析一个包含单个字符串:“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;
}
我正在使用 anaconda python 2.7 在 RedHat 上运行
我编译:
g++ `python-config --cflags` -L/home/user/anaconda/lib/ -lpython2.7 test.cpp -o test.out
使用 anaconda python 可能有问题吗?我已将问题分解为我能想到的最简单的情况......
【问题讨论】:
-
将不正确的
"2.3"改为2.3会发生什么? ("f"格式需要 double 而不是字符串!)。 -
是的,它仍然在 ParseTuple 行出现段错误。