我有一个用 C 语言编写的 Python 模块,其中暴露了许多函数。其中之一具有以下 Python 定义:
def SetPowerSupply(voltage, current, supply):
其中电压 = 浮动,电流 = 浮动,电源 = int。在 C 方面,我有这个:
float voltage, current;
int supply;
if (!PyArg_ParseTuple(args, "ffi", &voltage, ¤t, &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 提供的线索。