iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >python直接调用和使用swig法方调用c++库
  • 669
分享到

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

2024-04-02 19:04:59 669人浏览 独家记忆
摘要

c++运算速度快于python,Python简单易写。很多时候对于已有的c++代码也不想用python重写,此时就自然而然地想到用python调用c或者c++,两全其美。然而根据这些

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

首先是python调用c代码:

//GCc -g -o libpycall_c.so -shared -fPIC pycall_c.c
#include <stdio.h> 
#include <stdlib.h> 
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 <iOStream>
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 <iostream>

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 ctypes

lib = ctypes.CDLL("./libpycall.so")
print lib.get_number()  #0
lib.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:



double  My_variable  = 3.0;


int  fact(int n) {
    if (n <= 1) return 1;
    else return n*fact(n-1);
}


int my_mod(int n, int m) {
    return(n % m);
}

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


%module example
%{

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.oexample_wrap.o

最后执行:

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

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

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

到此这篇关于python直接调用和使用swig法方调用c++库的文章就介绍到这了,更多相关python调用c++库内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: python直接调用和使用swig法方调用c++库

本文链接: https://www.lsjlt.com/news/141288.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python直接调用和使用swig法方调用c++库
    c++运算速度快于python,python简单易写。很多时候对于已有的c++代码也不想用python重写,此时就自然而然地想到用python调用c或者c++,两全其美。然而根据这些...
    99+
    2022-11-13
  • python如何直接调用和使用swig法方调用c++库
    小编给大家分享一下python如何直接调用和使用swig法方调用c++库,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!c++运算速度快于python,python简单易写。很多时候对于已有的c++代码也不想用python重...
    99+
    2023-06-29
  • C++调用动态库和Python调用C++动态库的方法是什么
    这篇文章主要介绍“C++调用动态库和Python调用C++动态库的方法是什么”,在日常操作中,相信很多人在C++调用动态库和Python调用C++动态库的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答...
    99+
    2023-07-05
  • C#调用C++动态库接口函数和回调函数方法
    目录1. 前言2. 普通接口函数调用示例2.1 C++端编写接口2.2 C#端调用3. 回调函数调用示例3.1 C++端编写接口3.2 C#端调用1. 前言 需求: 当前C已经写好了...
    99+
    2022-11-13
  • C++调用动态库两种方式和Python调用C++动态库
    创建动态库动态库是在程序运行时加载的库文件,并不占用程序本身大小。选择动态库项目:新建.h和.cpp文件:# cat.h #pragma once extern "C" _declspec(dllexport) int sum(int a,...
    99+
    2023-05-14
    Python C++ 动态库
  • php直接调用js的方法名
    PHP作为一种非常流行的后端语言,被广泛用于构建各种类型的网站和应用程序。与此同时,JavaScript作为一种前端语言,被广泛用于交互式 Web 界面的开发。在许多情况下,开发人员需要通过PHP直接调用 JavaScript函数。在本篇文...
    99+
    2023-05-14
    php
  • ubuntu中python调用C/C++方法之动态链接库详解
    安装booJlLUslVOSst python调用C/C++的方法有很多,本文使用boost.python。考虑到后期有好多在boost上的开发工作,所以boost一并安装了,Boost库分为两个部分来使用,一是直接使...
    99+
    2022-06-04
    python调用动态链接库 python 动态链接库 ubuntu 动态链接库
  • C++通过内嵌解释器调用Python及间接调用Python三方库
    目录1.移植Python解释器2.VS配置(VS2017为例,此教程与VS版本无关)3.C++调用程序样例4.被调Python程序样例本文章目的是脱离安装Python环境的前提下,由...
    99+
    2022-11-12
  • 直接调用userMapper接口的方法是什么
    本篇内容主要讲解“直接调用userMapper接口的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“直接调用userMapper接口的方法是什么”吧!老...
    99+
    2022-10-19
  • php怎么直接调用js的方法名
    本篇内容主要讲解“php怎么直接调用js的方法名”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php怎么直接调用js的方法名”吧!使用PHP调用JavaScript函数PHP可以通过使用Java...
    99+
    2023-07-05
  • C#使用IronPython库调用Python脚本
    IronPython是一种在 .NET及 Mono上的 Python实现,由微软的 Jim Hugunin所发起,是一个开源的项目,基于微软的 DLR引擎。 IronPython的主...
    99+
    2022-11-13
  • C#--调用Python(包含第三方库)
    1. C# 调用 Python 常见的方法有4种 参考链接 1.1 Pythonnet (推荐) 可以很好的支持第三方库。 推荐这个,经本人验证这个很好用。 后文 2. 详细使用。 1.2 IronP...
    99+
    2023-09-29
    c# python
  • C#调用js库的方法小结
    目录前言安装ClearScript引入js文件创建V8ScriptEngine对象通过js引擎加载js文件C#调用js方法实现经纬度坐标纠偏C#调用js方法判断经纬度点位是否在多边形...
    99+
    2023-05-14
    C#调用js
  • linux中使用boost.python调用c++动态库的方法
    前言 最近开始使用 robot framework 测试c++的动态库,robot framework 是跑在 windows 上面,c++动态库是跑在远程linux主机上面。测试办法是让 robot framework...
    99+
    2022-06-04
    linux使用python linux boost.python linux调用动态库
  • python 调用c语言方法详解
      Python是一种强大的编程语言, Python在代码的编写中可以使用任何一种编程语言,可以利用其内置函数或模块来完成自己的任务。但是在 Python中调用其他语言的程序时,需要有特定的环境,例如:C、C++等。 在 python中调...
    99+
    2023-09-13
    python c语言 pycharm
  • C#怎么调用C++动态库接口函数和回调函数
    本文小编为大家详细介绍“C#怎么调用C++动态库接口函数和回调函数”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#怎么调用C++动态库接口函数和回调函数”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1. 前言...
    99+
    2023-06-29
  • C/C++ Crypto密码库调用的实现方法
    目录Sha256加密算法AES 加密与解密AES2 加密:Base64加解密:Hash加密算法RSA加密算法Crypt库实现RSA加密Crypto 库是C/C++的加密算法库,这个加...
    99+
    2022-11-12
  • C#中使用HttpPost调用WebService的方法
    WebService服务端代码 public class WebServiceDemo : System.Web.Services.WebService { ...
    99+
    2022-11-13
  • Python调用C++程序的方法详解
    前言 大家都知道Python的优点是开发效率高,使用方便,C++则是运行效率高,这两者可以相辅相成,不管是在Python项目中嵌入C++代码,或是在C++项目中用Python实现外围功能,都可能遇到Pyth...
    99+
    2022-06-04
    详解 程序 方法
  • 利用Chrome DevTools直接调试Node.js和JavaScript的方法详解(并行)
    前提 Node.js 6.3+, 这个可上Node.js官网自行下载; Chrome 55+. 如果您本地的chrome升级到最新版后还是<55, 可以从此处下载:Chrome Canary,亲测可...
    99+
    2022-06-04
    详解 方法 DevTools
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作