我有一些用C语言编写的用于游戏项目的函数。这些函数被调用很多次(大约每秒2000-4000次)。这些函数是用C语言编写的,以实现原始速度。现在,对我来说,将这些函数包含到Python中的最简单方法是使用ctypes。另一种方法是围绕这些函数编写Python的C扩展(这需要相当多的额外工作)。所以我想,不包括DLL的初始加载,ctypes的开销有多大?我使用的是Python2.7(标准CPython版本),我不想使用像Cython这样的外部库。我知道之前有人问过这个问题,但我没有看到太多关于两个选项之间性能比较的信息。 最佳答案 我比
Pythonctypes模块优点与适用场景ctypes有以下优点:•Python内建,不需要单独安装•Python可以直接调用C/C++动态链接库(.dll或.so)•在Python一侧,不需要了解c/c++dll内部的工作方式•提供了C/C++数据类型与Python类型的相互映射,以及转换,包括指针类型。ctypes在下列场景可以发挥较大作用运算量大的操作可以写成C/C++dll,python通过ctypes来调用,大幅提升Python代码性能。python可以直接使用C/C++一些优秀库资源,如boost库等。ctypes令python也可以使用指针类型,方便大块数据的处理,也可以应用于多
出于低级目的,我需要从任意地址构造一个ctypes指针,以整数形式给出。例如:INTP=ctypes.POINTER(ctypes.c_int)p=INTP(0x12345678)#i*know*thisistheaddress但所有这些尝试都会导致TypeError:expectedc_longinsteadofint我能做些什么来克服这个问题吗?如果有人想知道我为什么需要这个,这样做是为了从win32file.PyOVERLAPPED中提取OVERLAPPED结构,用于将ctypes公开的函数与win32file包装的API集成。谢谢,-托默 最佳答案
出于低级目的,我需要从任意地址构造一个ctypes指针,以整数形式给出。例如:INTP=ctypes.POINTER(ctypes.c_int)p=INTP(0x12345678)#i*know*thisistheaddress但所有这些尝试都会导致TypeError:expectedc_longinsteadofint我能做些什么来克服这个问题吗?如果有人想知道我为什么需要这个,这样做是为了从win32file.PyOVERLAPPED中提取OVERLAPPED结构,用于将ctypes公开的函数与win32file包装的API集成。谢谢,-托默 最佳答案
我正在使用ctypes在Python中实现一个C++函数。C++函数应该返回一个指向数组的指针。不幸的是,我还没有弄清楚如何在Python中访问数组。我尝试了numpy.frombuffer,但没有成功。它只是返回了一个任意数字的数组。显然我没有正确使用它。这是一个大小为10的数组的简单示例:function.cpp的内容:extern"C"int*function(){int*information=newint[10];for(intk=0;kwrapper.py的内容:importctypesimportnumpyasnpoutput=ctypes.CDLL('./library
我正在使用ctypes在Python中实现一个C++函数。C++函数应该返回一个指向数组的指针。不幸的是,我还没有弄清楚如何在Python中访问数组。我尝试了numpy.frombuffer,但没有成功。它只是返回了一个任意数字的数组。显然我没有正确使用它。这是一个大小为10的数组的简单示例:function.cpp的内容:extern"C"int*function(){int*information=newint[10];for(intk=0;kwrapper.py的内容:importctypesimportnumpyasnpoutput=ctypes.CDLL('./library
int(c_long(1))不起作用。 最佳答案 >>>ctypes.c_long(1).value1 关于python-如何将ctypes的c_long转换为Python的int?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2330587/
int(c_long(1))不起作用。 最佳答案 >>>ctypes.c_long(1).value1 关于python-如何将ctypes的c_long转换为Python的int?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2330587/
我有一个Python模块wrapper.py,它包装了一个CDLL。DLL与模块位于同一文件夹中。因此,我使用下面的代码来加载它:myDll=ctypes.CDLL("MyCDLL.dll")如果我从它自己的文件夹中执行wrapper.py这将有效。但是,如果我从其他地方运行它,它就会失败。这是因为ctypes计算相对于当前工作目录的路径。我的问题是,有没有一种方法可以指定DLL相对于包装器的路径而不是当前工作目录?这将使我能够将两者一起发布并允许用户从任何地方运行/导入包装器。 最佳答案 可以使用os.path.dirname(_
我有一个Python模块wrapper.py,它包装了一个CDLL。DLL与模块位于同一文件夹中。因此,我使用下面的代码来加载它:myDll=ctypes.CDLL("MyCDLL.dll")如果我从它自己的文件夹中执行wrapper.py这将有效。但是,如果我从其他地方运行它,它就会失败。这是因为ctypes计算相对于当前工作目录的路径。我的问题是,有没有一种方法可以指定DLL相对于包装器的路径而不是当前工作目录?这将使我能够将两者一起发布并允许用户从任何地方运行/导入包装器。 最佳答案 可以使用os.path.dirname(_