我已经编写了以下代码来修改我的自定义python类Point
,使用ctypes
库,遵循我在tutorial中找到的方法。wrap_function
只是一个易于使用的小助手,因为这是一个更大项目的MWE。你知道吗
在python方面:
import ctypes
import numpy as np
libc = ctypes.WinDLL(r'C:\Path\lib.dll')
def wrap_function(lib, funcname, restype, argtypes):
func = lib.__getattr__(funcname)
func.restype = restype
func.argtypes = argtypes
return func
class Point(ctypes.Structure):
_fields_ = [('x', ctypes.c_int), ('xdata', ctypes.c_void_p)]
list_of_points = [] #unused for now
xdata = np.zeros((40000,), dtype=np.double)
a = Point(1,xdata.ctypes.data)
b = Point(3,xdata.ctypes.data)
change_data_for_point = wrap_function(libc,'change_data_for_point', None, [ctypes.POINTER(Point)])
change_data_for_point(a)
在C面:
---header:
const int N = 40000;
typedef struct {
double x;
double xdata[N];
} Point;
extern "C" LIB_API void change_data_for_point(Point* p);
---source:
void change_data_for_point(Point* p) {
p->x++;
for (int i = 0; i < 40000; i++) {
p->xdata[i] = 2.0*i;
if (i % 1000 == 0) printf("xdata at index %d is %f\n", i, p->xdata[i]);
}
}
在Windows 7 cmd
中执行python文件时,它将打印以下输出:
xdata at index 0 is 0.000000
xdata at index 1000 is 2000.000000
// ... some more ...
xdata at index 17000 is 34000.000000
xdata at index 18000 is 36000.000000
Traceback (most recent call last):
File "test.py", line 40, in <module>
为什么停在18000?我试了好几次,有时循环达到19或20k,但从来没有比这更高。它是否与C端的数组初始化有关?我把python端的参数传递搞砸了吗?你知道吗
附加问题:我如何用ctypes将这些点的列表传递给C端?你知道吗
虽然NumPy增加了一个额外的复杂性级别,但是每一条信息都可以在[Python 3]: ctypes - A foreign function library for Python上找到。你知道吗
(主要)问题是点结构在C和Python中的定义不同。
另外,函数需要一个
Point*
,因此必须使用byref(没有它也可以工作,我不知道这是未定义行为的好例子,还是ctypes默默地做这件事-由于argtypes)。你知道吗为了工作我修改了你的代码。你知道吗
dll.c:
代码.py:
输出:
@EDIT0:
如果要处理点的列表,可以使用数组。比如:
相关问题 更多 >
编程相关推荐