Python脚本通过导入来测试DOLL的功能

时间:2014-01-28 14:13:08

标签: python unit-testing python-3.x ctypes

我有一个DLL来计算二次方程的根。它有4个API,其中3个用于设置二次方程ax ^ 2 + bx + c的系数,1个用于得到根,即:

void setA(const double a);
void setB(const double b);
void setC(const double C);
int getSolution(double *x, double *y);

下面的我的Python脚本使用ctypes来加载和测试DLL。它不起作用。我为xy获得了奇怪的输出。 getSolution的结果应该为0,但我得到1表示系数A为0。

from ctypes import *

# give location of dll
mydll = cdll.LoadLibrary("C:\\quadratic.dll")

mydll.setA(2)
mydll.setB(0)
mydll.setC(-4)
x = c_float(0)
y = c_float(0)
result = mydll.getSolution(byref(x), byref(y))
print(result)
print(x)
print(y)

我得到以下输出:

C:\>"C:\WINDOWS\py.exe" test.py    
1
c_float(0.0)
c_float(0.0)

请建议我出错的地方以及此方法测试DLL的替代方法。

2 个答案:

答案 0 :(得分:2)

您需要为ctypes原型化函数以传递正确的参数。它默认将整数传递为C int

from ctypes import *

mydll = CDLL("C:\\quadratic.dll")

mydll.setA.restype = None
mydll.setA.argtypes = [c_double]
mydll.setB.restype = None
mydll.setB.argtypes = [c_double]
mydll.setC.restype = None
mydll.setC.argtypes = [c_double]
mydll.getSolution.argtypes = [POINTER(c_double), POINTER(c_double)]

mydll.setA(2.0)
mydll.setB(0.0)
mydll.setC(-4.0)
x = c_double()
y = c_double()
result = mydll.getSolution(byref(x), byref(y))
print(result)
print(x.value)
print(y.value)

答案 1 :(得分:1)

您也可以使用cffi,只需复制函数原型:

from cffi import FFI

ffi = FFI()
ffi.cdef('''
    void setA(const double a);
    void setB(const double b);
    void setC(const double C);
    int getSolution(double *x, double *y);
''')

lib = ffi.dlopen("c:/quadratic.dll")
lib.setA(2)
lib.setB(0)
lib.setC(-4)

x = ffi.new("double *")
y = ffi.new("double *")
result = lib.getSolution(x, y)
print(result, x[0], y[0])