Chinaunix首页 | 论坛 | 博客
  • 博客访问: 232271
  • 博文数量: 59
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 493
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-26 17:46
个人简介

做技术要:鹰击长空,鱼翔浅底。

文章分类

全部博文(59)

文章存档

2017年(1)

2016年(3)

2015年(27)

2014年(28)

分类: Python/Ruby

2014-12-21 11:51:51

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) |
0

上一篇:wxPython如何布局

下一篇:Python点滴积累

给主人留下些什么吧!~~