全部博文(140)
分类: LINUX
2014-04-11 00:17:14
>>> from ctypes import *>>> libc=cdll.LoadLibrary("libc.so.6")>>> printf=libc.printf>>> printf("%c\n","c") //虽然有输出结果,但明显出错。这是因为Linux下调用C函数时,不存在数据类型的检查工作。D2>>> cc=c_char("c")>>> printf("%c\n",cc) //这时才有正确的输出.c2>>> cc.value //这是访问c_char的value值'c'>>> xxx='K'>>> cc.value = xxx //更改c_char类型的值>>> cc.value'K'>>> cc.value='P'>>> xxx //注意,cc.value值得修改不影响原先xxx的值.'K'
>>> iArray= c_int *10>>> iA=iArray()
>>> iA[3]=3>>> for x in range(0,10):... print iA[x]
int add(int num1[])
{return num1[0] + num1[1];}
>>> lib.add(cA) //这里无论是int num1[] 或者是 int * num1, 结果都一样。31实验发现:.so文件如果修改过,那么简单的再次执行LoadLibrary函数试图加载.so时,没有达到我们想要的结果。只能重新运行python
通过调用ctypes类型的指针函数来创建指针实例>>> from ctypes import *
>>> i=c_int(42)>>> pi=pointers(i)
>>> pi.contentsc_long(42)>>> pi.contents = c_int(20)>>> pi.contentsc_long(20)>>> ic_long(42)
>>> pi=pointer(i)>>> ic_long(100)>>> i.value=100000>>> pi.contentsc_long(100000)
>>> from ctypes import *>>> lib=cdll.LoadLibrary("/usr/local/lib/yan/return_types_of_values.so")>>> ci = c_int(100)>>> cic_long(100)>>> pi=pointer(ci)>>> lib.add(pi)200
>>> cic_long(200)
补充:指针的类型。
>>> PI = POINTER(c_int) //从此不需要type(pointer (c_int()) ) .
>>> PI
>>> PI(c_int(42))
>>>
>>> null_ptr = POINTER(c_int)()
>>> print bool(null_ptr)
False
>>> cc=c_float(2)>>> cc.value2.0>>> rr=byref(cc)>>> libc.sscanf("2.2", "%f", rr)1>>> cc.value2.200000047683716