我有一个设计糟糕的大(>300个公共(public)函数,>200个数值常量在头文件中用#define定义)我必须用Python包装。我有dll和h文件。该库每年更新一次,直到现在都以向后兼容的方式更新(即仅添加函数,常量保持其数值等)。但我不能保证,因为我不控制图书馆。使用ctypes,我看到了两种用Python包装它的方法:Mappingeveryconstantandfunctiontopython,1to1RedefiningtheAPIinPythonandmakingcallstothelibrary.第一个可以通过头文件以(大致)自动的方式完成,因此更易于维护和升级,第二
有没有一种简单的方法可以使用Python在Windows中显示文件的属性对话框?我正在尝试显示当您在资源管理器中右键单击文件并选择“属性”时弹出的同一窗口。 最佳答案 执行此操作的方法是调用WindowsShellExecuteEx()API传递properties动词。有各种高级Python包装器,但我没有成功地让它们中的任何一个与properties动词一起工作。相反,我会使用很好的旧ctypes。importtimeimportctypesimportctypes.wintypesSEE_MASK_NOCLOSEPROCESS
我正在尝试让一些开源学术代码正常工作(项目主页是here)。它是一个带有(非常)薄的python包装器的大型C++代码库,它使用CDLL加载C++并调用一些可用于允许代码的原始python脚本编写的C函数。但是,最初的导入代码崩溃了,因为它无法在站点包中找到它旁边的.so文件:在安装的文件中:fromctypesimport*try:self.lib=CDLL("_lammps.so")except:try:self.lib=CDLL("_lammps_serial.so")except:raiseOSError,"CouldnotloadLAMMPSdynamiclibrary"在脚
当调用在C共享库(动态库)中执行的循环时,Python不会收到KeyboardInterrupt,也不会响应(或处理)CTRL+C。我该怎么办? 最佳答案 除非你使用PyDLL或PYFUNCTYPE;GIL在ctypes调用期间被释放。因此,如果C代码没有安装自己的信号处理程序,Python解释器应该通过在主线程中引发KeyboardInterrupt来处理SIGINT。让Python代码在主线程中运行;您可以将ctypes调用放入后台线程:importthreadingt=threading.Thread(target=ctype
我正在使用一个通过ctypes模块调用的共享库。我想将与此模块关联的标准输出重定向到我可以在我的程序中访问的变量或文件。但是ctypes使用与sys.stdout不同的标准输出。我将演示我在使用libc时遇到的问题。如果有人复制和粘贴代码,他们可能需要更改第2行的文件名。importctypeslibc=ctypes.CDLL('libc.so.6')fromcStringIOimportStringIOimportsysoldStdOut=sys.stdoutsys.stdout=myStdOut=StringIO()print'ThistextgetscapturedbymyStd
我需要传递一个回调函数,它是CFuncType(ctypes.CFUNCTYPE或ctypes.PYFUNCTYPE...)。如何将python函数转换为CFuncType或如何在python中创建CFuncType函数。 最佳答案 我忘记了ctypes有多棒:以下是从http://docs.python.org/library/ctypes.html复制的所以我们的回调函数接收指向整数的指针,并且必须返回一个整数。首先我们为回调函数创建类型:CMPFUNC=CFUNCTYPE(c_int,POINTER(c_int),POINTE
所以我想弄清楚为什么我的ctypes.Structure的大小不是它应该的大小。我的代码如下,还有计算尺寸应该是多少的afaik。classFILE_HEAD(ctypes.Structure):_fields_=[("name",ctypes.c_char*4),#4bytes("size",ctypes.c_int),#4bytes("Cal_l",ctypes.c_double),#8bytes("Cal_r",ctypes.c_double),#8bytes("Speed_ChL",ctypes.c_byte),#1byte("Speed_Pulses_ChL",ctypes.
在Windows中,当我导入ctypes模块时,ctypes.cdll.msvcrt对象自动存在,它代表msvcrtMicrosoftC++运行时库accordingtothedocs.但是,我注意到还有一个find_msvcrt函数将“返回Python使用的VCruntype库的文件名”。它进一步指出,“如果您需要释放内存,例如,通过调用free(void*)的扩展模块分配的内存,请务必在与它相同的库中使用该函数分配了内存。”所以我的问题是,我已经拥有的ctypes.cdll.msvcrt库与我可以使用find_msvcrt函数加载的库有什么区别?在什么特定情况下它们可能不是同一个库
在C中,long在64位系统上是64位。这是否反射(reflect)在Python的ctypes中?模块? 最佳答案 long的大小dependsonthememorymodel.在Windows(LLP64)上它是32位,在UNIX(LP64)上它是64位。如果需要64位整数,请使用c_int64.如果你需要一个指针大小的整数,使用c_void_p(“该值表示为整数”)。 关于python-Python的ctypes.c_long在64位系统上是64位的吗?,我们在StackOverf
不太了解ctypes,最近才开始使用它。我在类似C的dll中有一个简单的函数,它返回一个指向动态生成的字符串的指针。它工作正常,但是,因为我手动为字符串分配内存,所以我应该在使用后释放它。我有这样的东西:extern"C"char*DLL_EXPORTfunc(constchar*str1,constchar*str2){returngetSomeString(str1,str2);}//GoalistocallthisfunctioncorrectlyfromPython.extern"C"voidDLL_EXPORTfreeMem(void*mem){if(mem!=NULL)de