2013-07-18 104 views
0

我創建了一個簡單的SWIG輔助函數來處理指針從C++代碼中,我包裹返回:的Python/SWIG類型錯誤

//in module foo: 
%inline %{ 
    double getPtrVal(double *ptr, int i) { 
    return (double) ptr[i]; 
    } 
%} 

,直到我試圖像這工作得很好:

for i in range(n): 
    for j in range(n): 
    val = foo.getPtrVal(ptrs, i) 

在該點處的Python返回了具有類型錯誤,抱怨n不是一個整數:

for i in range(n): 
TypeError: an integer is required 

我向你保證,n實際上是一個整數(type(n)一致返回<type 'int'>)。因此,我相信問題在於SWIG功能。奇怪的是,foo.getPtrVal(ptrs, i)被稱爲n次沒有問題,然後,第一次退出j內循環後立即拋出錯誤。有任何想法嗎?如果能澄清部分,我可以發佈更多的代碼段。謝謝!

+0

順便說一句,你的Python代碼的第一行最後缺少一個冒號。這可能是問題嗎? –

+0

原始代碼確實包含冒號,只是錯過了它的帖子。 – glinka

+0

「如果能澄清部件,我可以發佈更多的代碼段。」 - 如果您發佈的代碼不是您正在運行的代碼,那麼這是一個不誠實的問題。嘗試編譯並運行您發佈的代碼。 – Oktalist

回答

0

我遇到過類似的問題。如果SWIG C封裝代碼的某些部分沒有正確清理Python的內部異常狀態,那麼能夠在Python代碼中引發異常的下一個內建調用看起來是異常的來源。

range可以引發異常,因此Python在調用它後檢查其內部異常狀態,看到SWIG C包裝代碼遺留的異常,並假定它必須來自range

當我無法解決此類問題,我用這個醜陋的解決方法,以清除內部異常狀態:

try: 
     sys.stdout.write("") # any call capable of raising an exception will do 
except: 
     pass 

正確的方法可能是用%exception指令;請參閱SWIG manual。但是您首先需要確定哪個呼叫導致異常。

+0

有趣,非常感謝!我會放棄它,或者只是轉換爲純Python。我們將看看NumPy的速度與C++的特徵的比較。 – glinka

0

實際的代碼有沒有冒號?

+0

確實不是,那會是「SyntaxError」,我想,儘管如此,謝謝! – glinka