精华内容
下载资源
问答
  • CTypes

    2019-10-08 06:18:31
    Python中的ctypes模块可能是Python调用C方法中最简单的一种。ctypes模块提供了和C语言兼容的数据类型和函数来加载dll文件,因此在调用时不需对源文件做任何的修改。也正是如此奠定了这种方法的简单性。 示例如下 ...
    参考:http://docs.pythontab.com/interpy/c_extensions/ctypes/

    Python中的ctypes模块可能是Python调用C方法中最简单的一种。ctypes模块提供了和C语言兼容的数据类型和函数来加载dll文件,因此在调用时不需对源文件做任何的修改。也正是如此奠定了这种方法的简单性。

    示例如下

    实现两数求和的C代码,保存为add.c

    //sample C file to add 2 numbers - int and floats
    
    #include <stdio.h>
    
    int add_int(int, int);
    float add_float(float, float);
    
    int add_int(int num1, int num2){
        return num1 + num2;
    
    }
    
    float add_float(float num1, float num2){
        return num1 + num2;
    
    }

    接下来将C文件编译为.so文件(windows下为DLL)。下面操作会生成adder.so文件

    #For Linux
    $  gcc -shared -Wl,-soname,adder -o adder.so -fPIC add.c
    
    #For Mac
    $ gcc -shared -Wl,-install_name,adder.so -o adder.so -fPIC add.c

    现在在你的Python代码中来调用它

    #ipython
    
    from ctypes import *

    989881-20170529130644461-1435498650.png

    在这个例子中,C文件是自解释的,它包含两个函数,分别实现了整形求和和浮点型求和。

    在Python文件中,一开始先导入ctypes模块,然后使用CDLL函数来加载我们创建的库文件。这样我们就可以通过变量adder来使用C类库中的函数了。当adder.add_int()被调用时,内部将发起一个对C函数add_int的调用。ctypes接口允许我们在调用C函数时使用原生Python中默认的字符串型和整型。

    而对于其他类似布尔型和浮点型这样的类型,必须要使用正确的ctype类型才可以。如向adder.add_float()函数传参时, 我们要先将Python中的十进制值转化为c_float类型,然后才能传送给C函数。这种方法虽然简单,清晰,但是却很受限。例如,并不能在C中对对象进行操作。

    转载于:https://www.cnblogs.com/by2016/p/6917835.html

    展开全文
  • ctypes

    2018-02-06 15:50:16
    ctypes类型 C型 Python类型 c_bool _Bool bool c_char char 1个字符的字节对象 c_wchar wchar_t 1个字符的字符串 c_byte char int c_ubyte 无符号 char int c_short short int ...
    ctypes类型 C型 Python类型
    c_bool _Bool bool
    c_char char 1个字符的字节对象
    c_wchar wchar_t 1个字符的字符串
    c_byte char int
    c_ubyte 无符号 char int
    c_short short int
    c_ushort 无符号 短 int
    c_int int int
    c_uint 无符号 int int
    c_long long int
    c_ulong 无符号 长 int
    c_longlong __int64或长 长 int
    c_ulonglong 无符号 __ int64或无符号 长 长 t6 > int
    c_size_t size_t int
    c_ssize_t ssize_t or Py_ssize_t int
    c_float float float
    c_double double float
    c_longdouble long double float
    c_char_p char *(NUL terminated) 字节对象或None
    c_wchar_p wchar_t *(NUL terminated) 字符串或None
    c_void_p void * int或None
    In[2]: from ctypes import *
    In[3]: i = c_int32(1)  # c语言数字类型
    In[4]: i
    Out[4]: c_long(1)  # 
    In[5]: i.value = 2  # 通过.value来赋值
    In[6]: i
    Out[6]: c_long(2)
    In[7]: p = pointer(i)  # 创建指针指向i
    In[8]: p
    Out[8]: <ctypes.wintypes.LP_c_long at 0x5628f48>
    In[9]: p.contents  # 访问指针内容
    Out[9]: c_long(2)
    In[10]: p.contents = c_int(1)  # 改变指针指向的内容
    In[11]: p
    Out[11]: <ctypes.wintypes.LP_c_long at 0x5628f48>  # 指针没有发生变化
    In[12]: p.contents
    Out[12]: c_long(1)  # 指针指向的内容发生了变化
    

    测试单个c函数方法接口

    windows的dll,linux下的so
    1.编写single.c

    #include <stdio.h>                                                                 
    int add(int a){
        a = a +1;
        return a;
    }

    2.编译single.c

    gcc single.c -shared -o single.so //shared选项是让c的方法可以被外部调用

    3.测试
    3.1.测试调用c函数的时间
    编写single_c.py

    from ctypes import cdll
    c_lib=cdll.LoadLibrary('./single.so')
    a=1
    for i in range(1000000):
        a=c_lib.add(a)
    print(a)

    编写single_py.py

    def add(a):
        a = a + 1
        return a
    
    a=1
    for i in range(1000000):
        a=add(a)
    print(a)

    使用cProfile对二者进行测试

    python -m cProfile single_py.py # 测试纯python脚本的计算结果
    1000003 function calls in 0.314 seconds
    
    python -m cProfile single_c.py # 测试有c接口的python脚本计算结果
    136 function calls in 0.339 seconds

    结果是纯python脚本的速度要高于有c接口的

    测试带有循环的c函数接口

    1.编写loop.c

    #include <stdio.h>
    int add(int a){
        int i;
        for(i =1;i <=1000000;i++){
        a = a +1;
        }
        return a;
    }

    2.编译loop.c

    gcc single.c -shared -o single.so //shared选项是让c的方法可以被外部调用

    3.测试
    3.1.测试调用c函数的时间
    编写single_c.py

    from ctypes import cdll                                                                                                         
    c_lib=cdll.LoadLibrary('./hello_world.so')                                         
    a=1                                                                                
    a=c_lib.add(a)                                                                     
    print(a)

    使用cProfile对二者进行测试

    python -m cProfile single_py.py # 测试纯python脚本的计算结果
    1000003 function calls in 0.314 seconds
    
    python -m cProfile loop_c.py # 测试有c接口的python脚本计算结果
    135 function calls in 0.008 seconds

    参考文献:
    https://docs.python.org/2/library/ctypes.html
    https://www.cnblogs.com/gaowengang/p/7919219.html
    http://www.jb51.net/article/71216.htm
    http://python.jobbole.com/87044/

    展开全文
  • python ctypes详解-CTypes

    2020-11-11 14:08:11
    东滨社 · 更新于 2018-11-28 11:00:43CTypesPython中的ctypes模块可能是Python调用C方法中最简单的一种。ctypes模块提供了和C语言兼容的数据类型和函数来加载dll文件,因此在调用时不需对源文件做任何的修改。也...

    东滨社 · 更新于 2018-11-28 11:00:43

    CTypes

    Python中的ctypes模块可能是Python调用C方法中最简单的一种。ctypes模块提供了和C语言兼容的数据类型和函数来加载dll文件,因此在调用时不需对源文件做任何的修改。也正是如此奠定了这种方法的简单性。

    示例如下

    实现两数求和的C代码,保存为add.c

    //sample C file to add 2 numbers - int and floats

    #include

    int add_int(int, int);

    float add_float(float, float);

    int add_int(int num1, int num2){

    return num1 + num2;

    }

    float add_float(float num1, float num2){

    return num1 + num2;

    }

    接下来将C文件编译为.so文件(windows下为DLL)。下面操作会生成adder.so文件

    #For Linux

    $ gcc -shared -Wl,-soname,adder -o adder.so -fPIC add.c

    #For Mac

    $ gcc -shared -Wl,-install_name,adder.so -o adder.so -fPIC add.c

    现在在你的Python代码中来调用它

    from ctypes import *

    #load the shared object file

    adder = CDLL("./adder.so")

    #Find sum of integers

    res_int = adder.add_int(4,5)

    print "Sum of 4 and 5 = " + str(res_int)

    #Find sum of floats

    a = c_float(5.5)

    b = c_float(4.1)

    add_float = adder.add_float

    add_float.restype = c_float

    print "Sum of 5.5 and 4.1 = ", str(add_float(a, b))

    输出如下

    Sum of 4 and 5 = 9

    Sum of 5.5 and 4.1 = 9.60000038147

    在这个例子中,C文件是自解释的,它包含两个函数,分别实现了整形求和和浮点型求和。

    在Python文件中,一开始先导入ctypes模块,然后使用CDLL函数来加载我们创建的库文件。这样我们就可以通过变量adder来使用C类库中的函数了。当adder.add_int()被调用时,内部将发起一个对C函数add_int的调用。ctypes接口允许我们在调用C函数时使用原生Python中默认的字符串型和整型。

    而对于其他类似布尔型和浮点型这样的类型,必须要使用正确的ctype类型才可以。如向adder.add_float()函数传参时, 我们要先将Python中的十进制值转化为c_float类型,然后才能传送给C函数。这种方法虽然简单,清晰,但是却很受限。例如,并不能在C中对对象进行操作。

    展开全文
  • 解读: python3中有个内置模块叫ctypes,它是python3的外部函数库模块,提供了兼容C语言的数据类型,并通过它调用Linux系统下的共享库(Shared library),此模块需要使用centos7系统中外部函数库(Foreign function ...

    3.7版本需要一个新的包libffi-devel,安装此包之后再次进行编译安装即可。

    #yum install libffi-devel -y
    #make install

    若在安装前移除了/usr/bin下python的文件链接依赖,此时yum无法正常使用,需要自己下载相关软件包安装,为节省读者时间,放上链接

    #wget http://mirror.centos.org/centos/7/os/x86_64/Packages/libffi-devel-3.0.13-19.el7.x86_64.rpm
    #rpm -ivh libffi-devel-3.0.13-19.el7.x86_64.rpm

    安装完成后重新进行make install,结束后再次配置相关文件的软连接即可。

    解读:

    python3中有个内置模块叫ctypes,它是python3的外部函数库模块,提供了兼容C语言的数据类型,并通过它调用Linux系统下的共享库(Shared library),此模块需要使用centos7系统中外部函数库(Foreign function library)的开发链接库(头文件和链接库)。
    由于在centos7系统中没有安装外部函数库(libffi)的开发链接库软件包,所以在安装pip的时候就报了"ModuleNotFoundError: No module named '_ctypes'"的错误。

    展开全文
  • ctypes-开源

    2021-05-29 19:15:17
    ctypes 是一个 Python 模块,允许在 Python 中创建和操作 C 数据类型。 然后可以将它们传递给从动态链接库加载的 C 函数。
  • import ctypes.util Traceback (most recent call last): File <string>, line 1, in <module>: # Source code unavailable File Pythonista3.app/Frameworks/Py3Kit.framework/pylib/ctypes/util....
  • python ctypes

    2019-10-06 21:55:01
    official tutorial for ctypes libhttps://docs.python.org/3/library/ctypes.html1 ctypes exports the cdll, and on Windows windll and oledll objects, for loading dynamic link libraries you shoul...
  • yara-ctypes-python简介 yara-ctypes中有什么: 一个ctypes libyara包装器模块,该模块将libyara的输出公开到Python运行时中(请参阅: )。 具有与yara-project CPython扩展模块中公开的接口兼容的接口的线程安全...
  • Python ctypes

    2020-04-08 11:00:28
    - ctypes.POINTER(type) > This factory function creates and returns a new ctypes pointer type. > Pointer types are cached an reused internally, so calling this > function repeatedly is chea.....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,541
精华内容 2,216
关键字:

ctypes