ctypes 是Python的外部库函数,提供了C兼容的数据类型,它可以把动态链接库(Dynamic Link Library )windows 后缀DLL,*nux .so ,包装起来供Python使用。
gcc -o test.so -shared -fPIC test.c
-shared: 生成动态链接库,
-f:后面跟一些编译选项,PIC是其中一种,表示生成位置无关代码(Position Independent Code)
1.1载入动态链接库
Python调用DLL时使用的格式需要与DLL文件中函数的格式相匹配
例如,DLL文件定义函数如下:
int __declspec(dllexport) test(void);
如果是cdecl格式或者declspec格式,则Python调用DLL时需要使用以下方法:
dll = ctypes.cdll.LoadLibrary('Test.dll')
或
dll = ctypes.CDLL('Test.dll')
然后再用dll.test()使用函数。
如果是stdcall格式,则需要使用以下方法:
dll = ctypes.windll.LoadLibrary('Test.dll')
或
dll = ctypes.WinDLL('Test.dll')
然后再使用dll.test()使用函数。
Test.dll有时要加地址'./Test.dll'
1.2数据类型
所有这些类型都可以通过调用可选传输初始化值方式指定值:
对指针类型c_char_p/c_wchar_p/c_void_p的赋值将会改变其指向的内存区域地址,而不是改变内存块的值(当然了,因为Python字符串是只读的):
小心的是,不要传递这些的指针给可变内存。如果你需要可变内存块,ctypes提供了
create_string_buffer()函数。当前内存块可以存取或改变,如果你想要将其作为NUL结尾字符串方式,使用值的方法
>>> p = create_string_buffer("Hello", 10) # create a 10 byte buffer
>>> print sizeof(p), repr(p.raw)
10 'Hello\x00\x00\x00\x00\x00' >>>p.value = "Hi"
>>> print sizeof(p), repr(p.raw)
10 'Hi\x00lo\x00\x00\x00\x00\x00'
>>>
???如何传第一个Int,char 指针
#include
void test(char*a,int b)
{
printf("%s,%d",a,b);
}
void test1(int*a,int b)
{
printf("%d,%d",*a+1,b);
}
import ctypes
#dll= ctypes.windll.LoadLibrary( './test.so' )
dll=ctypes.cdll.LoadLibrary('./test.so')
str='helloWorld!\r\n'
ptr=ctypes.c_char_p
ptr.value=str
dll.test(str,10)
a=ctypes.c_int(44)
pa=ctypes.pointer(a)
b=55
dll.test1(pa,b)
sishuai@ubuntu:~/python/test1$ python test.py
helloWorld!
,10
45,55
阅读(1558) | 评论(0) | 转发(0) |