千家信息网

python如何直接调用和使用swig法方调用c++库

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,小编给大家分享一下python如何直接调用和使用swig法方调用c++库,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!c++运算速度快于python,python简单易写。很多时候对
千家信息网最后更新 2026年11月04日python如何直接调用和使用swig法方调用c++库

小编给大家分享一下python如何直接调用和使用swig法方调用c++库,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

c++运算速度快于python,python简单易写。很多时候对于已有的c++代码也不想用python重写,此时就自然而然地想到用python调用c或者c++,两全其美。
然而根据这些博客的说法,python只能实现c的调用,如果需要调用c++,还需要对c++代码进行额外的处理。

首先是python调用c代码:

//gcc -g -o libpycall_c.so -shared -fPIC pycall_c.c#include  #include  int foo(int a, int b) {   printf("you input %d and %d\n", a, b);   return a+b; }

此处一定要用gcc进行编译,,如果用g++就搞成c++了,python不能直接调用c++!(我在这里报错了很久,因为我用的是g++)

import ctypes lib = ctypes.CDLL("./libpycall_c.so")   lib.foo(1, 3) print '***finish***'

可见python调用c的方式还是很直接的。当调用c++时,使用g++编译生成C动态库的代码中的函数或者方法,需要使用extern "C"来进行编译。

//g++ -g -o libpycall.so -shared -fPIC pycall.c#include using namespace std;int foo(int a, int b){    cout << "the number you input:" << a << "\t" << b << endl;    return a + b;}extern "C" {   int foo_(int a, int b){       foo(a, b);      }}

对应的python代码:

import ctypes lib = ctypes.CDLL("./libpycall.so")   lib.foo_(1, 3) print '***finish***'

更高级一点,c++定义一个类,通过python调用c++类的方法。

首先写一个c++类:

//g++ -g -o libpycall.so -shared -fPIC -std=c++11 pycall.cpp#include using namespace std;class TestLib{    private:        int number = 0;    public:        void set_number(int num){            number = num;        }        int get_number(){            return number;        }}; extern "C" {    TestLib obj;    int get_number(){        return obj.get_number();    }    void set_number(int num){        obj.set_number(num);    }}

然后是python调用:

import ctypeslib = ctypes.CDLL("./libpycall.so")print lib.get_number()  #0lib.set_number(10)print lib.get_number()   #10

swig

Swig是一种软件开发工具,能让一些脚本语言调用C/C++语言的接口。它实现的方法是,通过编译程序将C/C++的声明文件(.i文件)编译成C/C++的包装器源代码(.c或.cxx)。通过直接调用这样的包装器接口,脚本语言可以间接调用C/C++语言的程序接口。SWIG支持的语言有:Perl, Python, Tcl, Ruby, Guile, and Java。

假如有这样一段C的代码,文件名为example.c:

/* File : example.c */double  My_variable  = 3.0;/* Compute factorial of n */int  fact(int n) {    if (n <= 1) return 1;    else return n*fact(n-1);}/* Compute n mod m */int my_mod(int n, int m) {    return(n % m);}

我们想在脚本语言的代码里面调用fact函数。可以通过一段非常简单的SWIG脚本,文件名为example.i:(这里的格式非常重要,即使第一行的注释也不能省略)

/* File : example.i */%module example%{/* Put headers and other declarations here */extern double My_variable;extern int    fact(int);extern int    my_mod(int n, int m);%}extern double My_variable;extern int    fact(int);extern int    my_mod(int n, int m);

这段.i文件分成3个部分:

  • 第一部分是 %module example, %module是SWIG脚本的一个命令,它表示生成的包装器将在一个模块内的名称。

  • 第二部分是%{… %},这一部分的内容会原封不动的插入到xxxx_wrap.c或xxxx_wrap.cxx文件中。

  • 第三部分就是剩下的部分了。这部分就是C语言或者C++语言的接口声明了。和C/C++的语法是一样的。

接下来以linux操作系统下,为python语言生成接口为例:

swig -python example.i

执行上述语句会生成两个文件example.py和example_wrap.c。 example.py就是python语言可以调用的example模块,而example_wrap.c则封装了example.c的封装器。

然后执行第二步:

gcc -c -fPIC example.c example_wrap.c -I/usr/include/python2.7

执行该步会生成两个o文件,example.o和example_wrap.o。

最后执行:

g++ -shared example.o example_wrap.o -o _example.so

这一步会将上面两个o文件封装成一个新的动态库,_example.so。在这之后就可以在python内直接调用example.c提供的接口了。

import exampleprint example.fact(3)print example.cvar.My_variable   #注意这里的参数不能直接用,得用cvar。

看完了这篇文章,相信你对"python如何直接调用和使用swig法方调用c++库"有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!

c++ 语言 文件 代码 接口 脚本 生成 编译 两个 就是 方法 包装 封装 法方 函数 动态 模块 程序 篇文章 部分 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 哈尔滨大商圈互联网科技有限公司 深圳九邦互联网科技有限公司 互联网科技工作委员会毛军 科技金融是不是互联网金融 互联网的科技创新 浩特互联网科技 时间互联网络科技 润盈互联网科技 互联网金融科技委员会 深圳互联网科技怎么样 青岛中康互联网医疗科技有限公司 互联网科技热点资讯 成都互联网科技公司工作好不好 本届互联网博览会上的黑科技 企晟互联网信息科技有限公司 为客找房互联网科技公司怎么样 山东子淼互联网科技有限公司 互联网第三次科技革命特征 富国互联网金融科技混合基金 互联网科技接地气 国智互联网科技 博兴的互联网电子科技公司 昭通互联网科技选哪家 花神(南京)互联网科技有限公司 深圳市优智互联网科技有限公司 中科明德北京互联网科技 怎样加入科技互联网 广州百诚互联网科技有限公司官网 容联科技互联网电商 现代互联网科技公司
0