第一次用swig,网上找了各种资料,比如

http://www.cnblogs.com/kaituorensheng/p/4464117.html

入门可以看上面这个链接

但要么过于简单要么过于复杂

我的需求是,现在有一个C++工程,包括多个.cpp和.h文件,并且使用了外部的.a .so库

使用python来调用。

假设python需要调用的C++类及其定义都在头文件hello.h中。

首先C++程序自己要能跑通

我们通过swig生成hello.py,并且编译所有.cpp文件,把所使用到的库都链接到hello.py中,然后就可以在python中import hello,使用hello.h中定义的函数和类了

第一步:

编写.i文件

编写hello.i如下

%module hello

%{

#include "hello.h"

%}

%include "hello.h"

运行命令:swig -c++ -python hello.i   生成hello_wrap.cxx

第二步:(这一步是重点)

虽然也可以直接使用gcc编译,但是对于复杂的项目来说,利用distutils来配置并编译简单得多

编写setup.py

from distutils.core import setup, Extension

hello_module = Extension('_hello',    #注意这里的名字和下划线,编译你自己的项目时只需要用你的模块名字替换hello就可以了

include_dirs=['./include'],       #这一行是指定你的头文件的位置,可以指定多个,用逗号分隔

library_dirs=['./libs'],    #这一行定义你的库文件的位置

libraries=['lib1‘,'lib2'],   #这一行是重点。如果你的C++中使用了其他.a和.so库,就需要在这里指定,

这些库文件必须在上一行中指定的目录中

sources=['hello_wrap.cxx', 'hello.cpp', 'util.cpp'], #这一行中指定要编译的.cpp文件,必须把第一步中生成的.cxx文件和项目中的所有.cpp文件都加进来

)

setup (name = 'hello',         #这里定义一些模块的基本信息

version = '0.1',

author      = "SWIG Docs",

description = """Simple swig example from docs""",

ext_modules = [hello_module],

py_modules = ["hello"],

)

编辑完上面的文件后,运行python setup.py build_ext --inplace

编译成功会生成hello.py文件

第三步:

由于使用到了外部的库,要把库文件的位置告诉系统,否则运行时是找不到这些库的

运行export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:库的路径

现在可以试试在python中调用是否成功了

运行python

import hello

h=hello.Hello()   #假如hello.cpp中定义了一个类Hello

h.func1(arg1,arg2)

...

补充:

1、如果C++接口参数中带 string或vector,python是识别不了的,需要在.i文件中加入定义

%include "std_string.i"和%include "std_vector.i"

并且说明需要支持的vector元素

例如,需要支持vector,则在.i文件中加入声明如下

%include "std_vector.i"

namespace std{

%template(intVector) vector;

}

相当于声明了一个intVector类,可以在python中使用

linux+swig+python,linux下使用swig让python调用C++(复杂版:包括多文件调用和链接库)...相关推荐

  1. linux python默认安装目录_非root用户在linux服务器自己目录下安装需要的python版本及其模块...

    由于之前使用服务器现在不再使用,最近使用一台新的服务器.科研分析用到一个python 程序, lmfit需要在服务器上运行.由于该程序基于python 2.7,而服务器默认安装的python 为2.6 ...

  2. ubuntu20.10(Linux)在wine下用pyinstaller打包python程序在window系统运行 交叉编译

    1.安装wine 在终端中输入: sudo apt-get install wine 2.安装pip 在https://pypi.org/project/pip/#files下载pip-21.0.ta ...

  3. 在现有的python环境下创建另一个python版本【亲测有效】

    比如,你现在的python环境是3.6,想要使用一个3.5,可以在anaconda环境下使用conda虚拟环境. 第一步: conda create -n py35 [创建Py35虚拟环境] 第二步: ...

  4. linux c之在终端如何依赖.o文件(静态链接库)运行C文件的命令

    1.问题 比如在linux的终端,我们运行有个aa.c文件,但是这个这C文件又依赖.o文件,之前我不知道怎么运行,今天才知道,直接放后面就行了 2.命令如下 gcc -g aa.c ***.o -o ...

  5. python向下_如何在python中向下转换

    我有两个类-一个继承自另一个.我想知道如何转换到(或创建)子类的新变量.我四处搜索了一下,大多数情况下,像这样的"沮丧"似乎是不受欢迎的,还有一些稍微有点棘手的解决方法,比如设置实 ...

  6. Linux下Makefile中动态链接库和静态链接库的生成与调用

    背景:写这篇博客的原因是:最近在搞嵌入式,需要交叉编译opencv库文件,自己写Makefile,通过arm-linux-g++编译.链接.生成可执行文件,从而实现了移植的过程.平台是Toradex的 ...

  7. linux 文件格式elf,linux ELF 文件格式 | ZION

    ELF 文件类型 ELF (Executable Linkable Format) 是linux下的可执行文件格式,与windows下的PE (Portable Executable) 格式一样,都是 ...

  8. python 运行程序代码_一些python程序

    <从问题到程序:用Python学编程和计算>--1.2 Python语言简介 本节书摘来自华章计算机<从问题到程序:用Python学编程和计算>一书中的第1章,第1.2节,作者 ...

  9. python appium自动化测试框架unittest_Appium基于Python unittest自动化测试 自动化测试框架 -- PO并生成html测试报告...

    基于python单元测试框架unittest完成appium自动化测试,生成基于html可视化测试报告 代码示例: #利用unittest并生成测试报告 class Appium_test(unitt ...

最新文章

  1. HarmonyOS ScrollView 使用
  2. Xamarin iOS教程之键盘的使用和设置
  3. 神策数据杨宁:从三重“新”看金融机构财富管理转型
  4. Notepad++ 设置执行 lua 和 python
  5. 查看linux服务器的系统信息
  6. 转Win 7 快捷键
  7. rk3288问题总结!
  8. eviews计算covar_第7章 我国商业银行风险溢出效应的度量—基于GARCH-CoVaR模型
  9. ZF与MMSE接收检测
  10. restapi是什么意思_RESTful-API还没理解么?只是因为你没看这篇文章,其实它很简单...
  11. 语音端点检测整理 VAD
  12. 判断手机号是否是素数
  13. VMware网络NAT模式无法连接解决方法
  14. 技术质量部年度工作总结
  15. 【AUDIO音频兴趣拓展】如何测试喇叭端功率?音频功放输出端测试到波形为方波
  16. python期末作业——BMR计算器
  17. 以为微信里3008位好友就是人脉,殊不知有18位已经把我删除了
  18. ONVIF协议开发之网络摄像头云台控制(C版)
  19. Linux-2.6.32.2内核在mini2440上的移植(四)---根文件系统制作(1)
  20. 统计字母、空格、数字和其它字符个数 (Java经典编程案例)

热门文章

  1. 清华学生计划表上热搜,大写的服!
  2. 使用bottle进行web开发:get的参数传递,form数据传递等
  3. 规格选项表管理之保存规格选项表数据
  4. 多个文件中的数据处理,输出自己想要是数据
  5. MySQL数据库分组和聚合函数组合使用
  6. 子网掩码 以及 子网数为什么减去全0和全1
  7. CPU 周期信号、节拍周期信号、节拍脉冲信号三者之间的关系是什么?
  8. 始于TensorFlow ,终于PyTorch
  9. 【OpenCV 4开发详解】图像二值化
  10. java中具有继承关系的类及其对象初始化顺序