草庐IT

Python 对象作为 ctypes 回调函数中的用户数据

C函数myfunc对更大的数据block进行操作。结果以block的形式返回给回调函数:intmyfunc(constchar*data,int(*callback)(char*result,void*userdata),void*userdata);使用ctypes,从Python代码调用myfunc并将结果返回给Python回调函数没什么大不了的。此回调工作正常。myfunc=mylib.myfuncmyfunc.restype=c_intmyfuncFUNCTYPE=CFUNCTYPE(STRING,c_void_p)myfunc.argtypes=[POINTER(c_char

python - 删除 Python 对象时,Ctypes Structures 和 POINTERS 是否会自动释放内存?

当使用PythonCTypes时,有结构允许您在Python端克隆c结构,还有POINTERS对象从内存地址值创建一个复杂的Python对象,并可用于通过引用传回对象等等C代码。我在文档或其他地方找不到的是当包含结构类的Python对象从C代码的返回指针(即C函数为结构分配的内存)取消引用时会发生什么自己删除了。原始C结构的内存是否已释放?如果不是怎么办?此外——如果Structure本身包含指向也由C函数分配的其他数据的指针怎么办?删除Structure对象会释放其成员上的指针吗?(我怀疑是)否则——怎么办?尝试从Python调用系统“免费”以获取结构中的指针对我来说会使Python

使用 ctypes 和 windll 的带有图标的 Python MessageBox

因此,我正在寻找一种仅使用native库在Python中创建简单Messagebox的方法,并遇到了几篇文章,但即thisone,利用ctypes导入win32.dll并调用其MessageboxA函数。importctypes#AnincludedlibrarywithPythoninstall.ctypes.windll.user32.MessageBoxA(0,"Yourtext","Yourtitle",1)我认为这是非常酷的东西。---但是---当我什么时候看documentationforMessageboxAonMicrosoft'ssite,事实证明这个Messageb

Python:我们可以将 ctypes 结构转换为字典吗?

我有一个ctypes结构。classS1(ctypes.Structure):_fields_=[('A',ctypes.c_uint16*10),('B',ctypes.c_uint32),('C',ctypes.c_uint32)]如果我有X=S1(),我想从这个对象返回一个字典:例如,如果我做类似的事情:Y=X.getdict()或Y=getdict(X),那么Y可能看起来像:{'A':[1,2,3,4,5,6,7,8,9,0],'B':56,'C':8986}有什么帮助吗? 最佳答案 大概是这样的:defgetdict(st

python - 通过自省(introspection)打印 ctypes "Structure"的所有字段

测试.c:#include#includestructs{chara;intb;floatc;doubled;};structs*create_struct(){structs*res=malloc(sizeof(structs));res->a=1;res->b=2;res->c=3.0f;res->d=4.0;returnres;}测试.py:fromctypesimport*classS(Structure):_fields_=[('a',c_byte),('b',c_int),('c',c_float),('d',c_double)]lib=CDLL('./test.so')c

c++ - 如何在 Python ctypes 中处理 C++ 返回类型 std::vector<int>?

我找不到ctypes如何弥合std::vector和Python之间的差距;互联网上没有提到的组合。这是不好的做法,它不存在还是我遗漏了什么?C++:xxx.cpp#include#includeusingnamespacestd;extern"C"std::vectorfoo(constchar*FILE_NAME){stringline;std::vectorresult;ifstreammyfile(FILE_NAME);while(getline(myfile,line)){result.push_back(1);}return(result);}Python:xxx.pyim

python - 如何使用 ctypes 将 null 传递给外部库,并使用 ctypeslib.ndpointer 声明的参数?

灵感来自另一个answer在这里,我有一个使用ctypeslib.ndpointer调用的ctypes函数:lib.foo.argtypes=[ctypeslib.ndpointer(np.complex64,ndim=1,flags='C'),POINTER(c_int)]外部函数声明如下:voidfoo(cmplx_float*array,int*length)我的问题是我想调用该函数两次。第一次我想将nullptr传递给array参数,这样我就可以找出所需的长度。然后第二次,我会传入一个numpy数组。所以我这样做:lib.foo(None,length)失败并出现以下错误:ct

python - 为什么 ctypes 将 Python 列表转换为 C 数组的速度如此之慢?

我的代码的瓶颈目前是使用ctypes从Python列表到C数组的转换,如所述inthisquestion.一个小实验表明,与其他Python指令相比,它确实很慢:importtimeitsetup="fromarrayimportarray;importctypes;t=[iforiinrange(1000000)];"print(timeit.timeit(stmt='(ctypes.c_uint32*len(t))(*t)',setup=setup,number=10))print(timeit.timeit(stmt='array("I",t)',setup=setup,numb

python - 使用 ctypes 数组作为 numpy 数组时的 PEP 3118 警告

当我尝试将ctypes数组用作numpy数组时收到以下警告消息:Python2.7.1(r271:86832,Nov272010,18:30:46)[MSCv.150032bit(Intel)]onwin32Type"help","copyright","credits"or"license"formoreinformation.>>>importctypes,numpy>>>TenByteBuffer=ctypes.c_ubyte*10>>>a=TenByteBuffer()>>>b=numpy.ctypeslib.as_array(a)C:\Python27\lib\site-pa

python - ctypes 从 c 函数返回一个字符串

我是Python的老手,但对C的涉猎不多。在互联网上半天没有找到适合我的东西后,我想我应该在这里问一下并获得我需要的帮助。我想做的是编写一个简单的C函数,它接受一个字符串并返回一个不同的字符串。我计划用多种语言(Java、Obj-C、Python等)绑定(bind)此函数,所以我认为它必须是纯C语言?这是我目前所拥有的。请注意,当我尝试在Python中检索值时出现段错误。你好.c#include#include#includeconstchar*hello(char*name){staticchargreeting[100]="Hello,";strcat(greeting,name)