0
我有一個用C語言編寫的Python模塊,其中暴露了許多函數。其中之一的Python定義如下:Python的C接口PyArg_ParseTuple失敗
def SetPowerSupply(voltage, current, supply):
其中voltage = float,current = float和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的線索。
我發現問題根據您的提示。這與「none」無關,而是與不清除之前函數的錯誤有關。我將用答案更新原始問題。 - 謝謝!! – Eric 2012-07-13 18:14:34