2013-07-18 105 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