Python C接口PyArg_ParseTuple失败

时间:2012-07-13 17:04:10

标签: python c

我有一个用C语言编写的Python模块,其中暴露了许多功能。其中一个有Python定义:

def SetPowerSupply(voltage, current, supply):

其中voltage = float,current = float和supply = int。在C方面,我有这个:

float voltage, current;
int supply;

if (!PyArg_ParseTuple(args, "ffi", &voltage, &current, &supply))
{
    // Failed to parse
    // ...
}

我的一个脚本编写者有一个脚本,其中此函数无法解析参数,抱怨期望一个整数。据我所知,一个整数实际上是传入的,因为如果在错误分支中我这样做:

PyObject *num = PyNumber_Float(PyTuple_GetItem(args, 0));
voltage = PyFloat_AsDouble(num);
Py_XDECREF(num);

num = PyNumber_Float(PyTuple_GetItem(args, 1));
current = PyFloat_AsDouble(num);
Py_XDECREF(num);

num = PyNumber_Int(PyTuple_GetItem(args, 2));
supply = PyLong_AsLong(num);
Py_XDECREF(num);

...然后一切都按预期工作。通过此模块运行的其他脚本不会出现此行为,我看不出任何差异。他们俩都称这个函数是一样的:

SetPowerSupply(37.5, 0.5, 1)
SetPowerSupply(0, 0, 1)

在违规脚本中,我可以这样做:

任何想法???

谢谢。


编辑:

问题是由另一个在此函数之前调用多个函数的函数引起的。那是:

if(!PyArg_ParseTuple(args, "s|siss", &board, &component, &pin, &colorStr, &msg))
{
    // Parsing the pin as an int failed, try as a string
    if(!PyArg_ParseTuple(args, "s|ssss", &board, &component, &sPin, &colorStr, &msg))
    {
        // ...

这样做的目的是基本上重载第三个参数以接受字符串或数值。当有人向其提供字符串时,失败的解析中的Python错误从未被清除。解决该问题的更新代码如下。

if(!PyArg_ParseTuple(args, "s|siss", &board, &component, &pin, &colorStr, &msg))
{
    PyErr_Clear();

    // Parsing the pin as an int failed, try as a string
    if(!PyArg_ParseTuple(args, "s|ssss", &board, &component, &sPin, &colorStr, &msg))
    {
        // ...

非常感谢Ignacio的线索。

1 个答案:

答案 0 :(得分:0)

您的其他功能之一是在适当的时候无法返回None,并且您意外捕获此错误消息。