zoukankan      html  css  js  c++  java
  • Python ctypes 模块

    一: 模块介绍

      模块ctypes是Python内建的用于调用动态链接库函数的功能模块,一定程度上可以用于Python与其他语言的混合编程。由于编写动态链接库,使用C/C++是最常见的方式,故ctypes最常用于Python与C/C++混合编程之中。

    二:ctypes 的原理以及优缺点

      从ctypes的文档中可以推断,在各个平台上均使用了对应平台动态加载动态链接库的方法,并通过一套类型映射的方式将Python与二进制动态链接库相连接。通过阅读ctypes本身的代码也可以印证这个推断(/Modules/_ctypes/_ctypes.c和/Modules/_ctypes/callproc.c)。在Windows平台下,最终调用的是Windows API中LoadLibrary函数和GetProcAddress函数,在Linux和Mac OS X平台下,最终调用的是Posix标准中的dlopen和dlsym函数。ctypes 实现了一系列的类型转换方法,Python的数据类型会包装或直接推算为C类型,作为函数的调用参数;函数的返回值也经过一系列的包装成为Python类型。也就是说,PyObject* <-> C types的转换是由ctypes内部完成的,这和SWIG是同一个原理。

    从ctypes的实现原理不难看出:

    ctypes 有以下优点:

    • Python内建,不需要单独安装
    • 可以直接调用二进制的动态链接库
    • 在Python一侧,不需要了解Python内部的工作方式
    • 在C/C++一侧,也不需要了解Python内部的工作方式
    • 对基本类型的相互映射有良好的支持

    ctypes 有以下缺点:

    • 平台兼容性差
    • 不能够直接调用动态链接库中未经导出的函数或变量
    • 对C++的支持差

    就个人的经验来看,ctypes 适合于“中轻量级”的Python C/C++混合编程。特别是遇到第三方库提供动态链接库和调用文档,且没有编译器或编译器并不互相兼容的场合下,使用ctypes特别方便。值得注意的是,对于某种需求,在Python本身就可以实现的情况下(例如获取系统时间、读写文件等),应该优先使用Python自身的功能而不要使用操作系统提供的API接口,否则你的程序会丧失跨平台的特性。

    三:使用举例

    linux下测试:hello word

    #include<stdio.h>
    
    int main()
    {
    	printf("Hello World!");
    	return 1;
    }
    

    这里只有一个main函数,注意:gcc(Linux和Mac OS X的默认编译器)下,所有函数默认均导出,windows需要

    接下来把它编译为动态链接库。Windows下动态链接库的扩展名是dll,Linux下是so,Mac OS X下是dylib。这里为了方便起见,一律将扩展名设定为dll。  

    Windows GCC、Linux、Mac OS X下编译命令相同:

    gcc -fPIC -shared -msse4.2 hello.c -o hello.dll #或者为hello.so

    使用python来调用:

    >>> from ctypes import *
    >>>mm = cdll.LoadLibrary('hello.dll')##或者为hello.so,

    >>> mm.main()
    hello world!1
    ------------------------

    more:

    http://www.cnblogs.com/ryhan/p/6056316.html

  • 相关阅读:
    aix lvm_lv_vg
    Centos6.5 telnet wireshark
    Qt开发初步,循序渐进,preRequest for 蓝图逆袭
    CentOs文件实时同步
    Qt GUI开发实战初期
    linux环境开发私房菜
    linux GUI程序开发
    Centos6.5 Qt4开发 Cannot find -lGL QApplication not file or dir
    Centos6.5升级gcc for qt5.3.1
    对Socket CAN的理解(5)——【Socket CAN控制器的初始化过程】
  • 原文地址:https://www.cnblogs.com/spacepirate/p/6602275.html
Copyright © 2011-2022 走看看