2012-07-13 29 views
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, &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的線索。

回答

0

您的其他功能之一在適當情況下未能返回None,並且您偶然捕獲到此錯誤消息。

+0

我發現問題根據您的提示。這與「none」無關,而是與不清除之前函數的錯誤有關。我將用答案更新原始問題。 - 謝謝!! – Eric 2012-07-13 18:14:34