python 调用c语言详解

作者: Tim在路上 | 来源:发表于2018-10-03 15:50 被阅读0次

python语言调用c语言进行扩展,或者增加程序的运行速度都是特别方便的。同时还能获得与C或者C++几乎相同的执行性能。

Python调用C语言的方式

  • CTYPES,
  • SWIG,
  • BOOST.PYTHON,
  • CYTHON

python是解释型语言,只能调用c的动态链接库。

那什么是库,什么是静态库与动态库?
库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。

本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。

静态库与动态库的区别

静态库与动态库的区别主要是在链接阶段,分别称为静态链接方式与动态链接方式。

静态库是链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。

动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入

为什么需要动态库?

静态库在内存中存在多份拷贝导致空间浪费,假如静态库占1M内存,有2000个这样的程序,将占用2GB的空间

静态库对程序的更新、部署和发布页会带来麻烦。如果静态库liba.lib更新了,所以使用它的应用程序都需要重新编译、发布给用户。

创建动态库与静态库

静态库

生成.o文件
g++ -c StaticMath.cpp

生成.a文件
ar -crv libstaticmath.a StaticMath.o

动态库

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

For windows

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

extern 和 static

extern对应的关键字是static,被它修饰的全局变量和函数只能在本模块中使用。而extern修饰代表可以在本模块外使用。

三步简化c的调用

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

一、编写c

#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;

}

二、编译为动态链接库

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

三、py调用c

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

相关文章

  • python 调用c语言详解

    python语言调用c语言进行扩展,或者增加程序的运行速度都是特别方便的。同时还能获得与C或者C++几乎相同的执行...

  • C++ 调用Python3

    作为一种胶水语言,Python 能够很容易地调用 C 、 C++ 等语言,也能够通过其他语言调用 Python 的...

  • Python 的 C 接口

    cffi是连接Python与c的桥梁,可实现在Python中调用c文件。cffi为c语言的外部接口,在Python...

  • 使用CFFI为PYNQ嵌入C语言

    前言 CFFI是连接Python与c的桥梁,可实现在Python中调用c文件。CFFI为c语言的外部接口,在Pyt...

  • Python调用C语言函数

    ctype说明 ctypes是Python的一个外部库,可以通过Ctypes调用C/C++语言的函数。 ctype...

  • 使用ctypes模块在Python代码调用C函数

    使用Python语言进行编程的时候可能会需要调用用C语言开发的库,那么如何调用呢,传递给C函数的参数以及返回值如何...

  • C语言快速入门 - Hello World 详解

    目录 C语言快速入门 C语言快速入门 - Hello World 详解 C语言快速入门 - 变量 C语言快速入门 ...

  • C语言快速入门 - 简单运算符

    目录 C语言快速入门 C语言快速入门 - Hello World 详解 C语言快速入门 - 变量 C语言快速入门 ...

  • C语言快速入门 - 控制语句

    目录 C语言快速入门 C语言快速入门 - Hello World 详解 C语言快速入门 - 变量 C语言快速入门 ...

  • C语言快速入门 - 变量

    目录 C语言快速入门 C语言快速入门 - Hello World 详解 C语言快速入门 - 变量 C语言快速入门 ...

网友评论

    本文标题:python 调用c语言详解

    本文链接:https://www.haomeiwen.com/subject/xpnzoftx.html