zoukankan      html  css  js  c++  java
  • 在Linux上实现Python调用C语言函数

    一般思路

    Python中内置ctypes库,需调用c编译成的.so文件来实现函数调用。
    假设我们所需调用的c文件名为test.c,文件里有我们需要的函数func(x,y).

    将.c文件编译成 .so文件

    gcc -fPIC -shared test.c -o test.so

    运行后会看到有test.so文件生成。

    在Python中导入C文件

    在当前目录下打开Python

    import os
    from ctypes import *
    
    p = os.getcwd() + '/test.so’ #表示.so文件的绝对路径,如果你没在当前路径打开python则可能需要修改
    f = CDLL(p) #读取.so文件并赋给变量f
    
    

    这时如果没报错,就说明导入该.so文件成功了,可以调用脚本中的函数。

    调用函数

    # 变量为整数
    a = 3
    b = 4
    f.func(a, b) #该步即运行函数func(x,y)
    
    # 变量为浮点数
    c = c_float(5.5)
    d = c_float(6.66)
    f.func(c, d)
    

    以上便为调用C中函数的简单形式。

    复杂情况

    有时,在我们需要的C脚本中,调用了其他的库,或者也同时调用了以 .h形式被调用的同级别的C脚本。这种情况需要以下步骤:

    将所有.c文件编译为 .o文件

    该步骤就按你的需求去编译生成,但记得加入 -fPIC, 编译后生成一个或多个.o文件。如果你的C脚本只有一个(即并未调用其他同级别C脚本),当然只有1个.o文件。几个C脚本生成几个.o文件。

    将所有.o文件编译为.so文件

    gcc -shared -o main.so *.o *-lfftw3 *

    上述命令将所有的.o文件编译为main.so文件,最后的-lfftw3表示C脚本中调用的其他库,我的是fftw3库,你需要加你自己调用的库名字。运行后可生成main.so文件
    可用 ldd -r main.so查看.so文件,如果未出现undefined symbol,则编译应该是正确的。

    运行脚本

    如果你需要运行脚本而不是只用某个函数,可直接运行该脚本的 main函数

    import os
    from ctypes import *
    
    p = os.getcwd() + '/test.so’
    f = CDLL(p)
    f.main() #运行C脚本中的main函数
    
  • 相关阅读:
    从Ecma规范深入理解js中的this的指向
    js中继承的几种用法总结(apply,call,prototype)
    缓存 Array.length 是老生常谈的小优化
    spark app
    source code spark
    spark dev by IDEA
    编译spark-0.9.1
    图解GIT,ZT
    Spark分布式安装
    倒排索引(Inverted Index)
  • 原文地址:https://www.cnblogs.com/guiguiguoguo/p/11777056.html
Copyright © 2011-2022 走看看