linux+swig+python,linux下使用swig让python调用C++(复杂版:包括多文件调用和链接库)...
第一次用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++(复杂版:包括多文件调用和链接库)...相关推荐
- linux python默认安装目录_非root用户在linux服务器自己目录下安装需要的python版本及其模块...
由于之前使用服务器现在不再使用,最近使用一台新的服务器.科研分析用到一个python 程序, lmfit需要在服务器上运行.由于该程序基于python 2.7,而服务器默认安装的python 为2.6 ...
- 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 ...
- 在现有的python环境下创建另一个python版本【亲测有效】
比如,你现在的python环境是3.6,想要使用一个3.5,可以在anaconda环境下使用conda虚拟环境. 第一步: conda create -n py35 [创建Py35虚拟环境] 第二步: ...
- linux c之在终端如何依赖.o文件(静态链接库)运行C文件的命令
1.问题 比如在linux的终端,我们运行有个aa.c文件,但是这个这C文件又依赖.o文件,之前我不知道怎么运行,今天才知道,直接放后面就行了 2.命令如下 gcc -g aa.c ***.o -o ...
- python向下_如何在python中向下转换
我有两个类-一个继承自另一个.我想知道如何转换到(或创建)子类的新变量.我四处搜索了一下,大多数情况下,像这样的"沮丧"似乎是不受欢迎的,还有一些稍微有点棘手的解决方法,比如设置实 ...
- Linux下Makefile中动态链接库和静态链接库的生成与调用
背景:写这篇博客的原因是:最近在搞嵌入式,需要交叉编译opencv库文件,自己写Makefile,通过arm-linux-g++编译.链接.生成可执行文件,从而实现了移植的过程.平台是Toradex的 ...
- linux 文件格式elf,linux ELF 文件格式 | ZION
ELF 文件类型 ELF (Executable Linkable Format) 是linux下的可执行文件格式,与windows下的PE (Portable Executable) 格式一样,都是 ...
- python 运行程序代码_一些python程序
<从问题到程序:用Python学编程和计算>--1.2 Python语言简介 本节书摘来自华章计算机<从问题到程序:用Python学编程和计算>一书中的第1章,第1.2节,作者 ...
- python appium自动化测试框架unittest_Appium基于Python unittest自动化测试 自动化测试框架 -- PO并生成html测试报告...
基于python单元测试框架unittest完成appium自动化测试,生成基于html可视化测试报告 代码示例: #利用unittest并生成测试报告 class Appium_test(unitt ...
最新文章
- HarmonyOS ScrollView 使用
- Xamarin iOS教程之键盘的使用和设置
- 神策数据杨宁:从三重“新”看金融机构财富管理转型
- Notepad++ 设置执行 lua 和 python
- 查看linux服务器的系统信息
- 转Win 7 快捷键
- rk3288问题总结!
- eviews计算covar_第7章 我国商业银行风险溢出效应的度量—基于GARCH-CoVaR模型
- ZF与MMSE接收检测
- restapi是什么意思_RESTful-API还没理解么?只是因为你没看这篇文章,其实它很简单...
- 语音端点检测整理 VAD
- 判断手机号是否是素数
- VMware网络NAT模式无法连接解决方法
- 技术质量部年度工作总结
- 【AUDIO音频兴趣拓展】如何测试喇叭端功率?音频功放输出端测试到波形为方波
- python期末作业——BMR计算器
- 以为微信里3008位好友就是人脉,殊不知有18位已经把我删除了
- ONVIF协议开发之网络摄像头云台控制(C版)
- Linux-2.6.32.2内核在mini2440上的移植(四)---根文件系统制作(1)
- 统计字母、空格、数字和其它字符个数 (Java经典编程案例)