Windows平台下Python使用swig调用C++

步骤0:swig简介

swig是一种可以将C++代码转换为多种脚本语言封装的工具,可以在swig官网www.swig.org下载,解压后将swig.exe的路径添加到环境变量path中即可使用swig

步骤1:准备C++代码

编写需要在Python中调用的C++代码,最好将函数和类的声明统一放到头文件中,函数和类的实现放到源文件中

C++头文件

头文件主要包括:

  • #include调用(例如#include <iostream>
  • 命名空间指定using namespace std;
  • 函数和类的声明
#include <iostream>
using namespace std;

class example {
    private:
        int num;
    public:
        void say_hello(void);
        void change(int din);
        int get_num();
};

C++源文件

源文件为头文件中函数和类的实现

#include "example.h"

void example::say_hello(void) {
    cout << "hello python,I am C++" << endl;
}

void example::change(int din) {
    num = din;
}

int example::get_num(void) {
    return num;
}

步骤二:使用swig封装

编写封装说明文件

swig封装需要一个.i后缀文件的封装说明,其中

  • %module <name>为封装名称,Python调用的包名就是<name>
  • %{...%}为附加的函数说明和头文件,源文件以外的部分都要包括在这里,包括头文件和宏定义等
  • 之后为要封装的函数或类,可以直接引用头文件(若已经将要封装的部分的声明写在头文件中)
%module Example_swig

%{
#include "example.h"
%}

%include "example.h"

调用swig封装

在命令行中输入swig -python -c++ <swig_config>.i,其中<swig_config>.i为上面写的说明文件

swig -python -c++ example.i

调用后生成两个文件:

  • <cpp_source>_wrap.cxx文件
  • <name>.py文件

步骤三:使用VS编译

安装VC140编译器

python3.5使用的编译器是VC140编译器,对应版本是VS2015,本次使用的是VS2017使用VC141编译器。需要在VS2017中安装VC140编辑器,可以直接在工具->获取工具和功能中安装

配置VS编译环境

在C++的空工程基础上建立环境

配置输出类型

生成->配置管理器中设置:

  • 活动解决方案配置Release
  • 活动解决方案平台X64(本机为64位机)

配置输出

引入Python库(关键)

项目->属性中配置Python的库

  • VC++目录中的包含目录中,导入Python安装路径下的include路径(包含Python.h)
  • 链接器->常规附加库目录中,导入Python安装路径下的libs路径(注意不是Lib路径,包括dll文件)

配置头文件

配置库

编译输出

选择生成->生成解决方案,在X64->Release文件夹下有一个dll文件,即为编译输出的动态链接库。将其名称改为_<name>.pyd(本例中为_Example_swig.pyd),将其与swig生成的<name>.py文件放在同一目录中

步骤四:测试调用

在python,使用import <name>即可调用刚才生成的包(同一目录下)

import Example_swig

a = Example_swig.example()
a.say_hello()

a.change(3)
print(a.get_num())
hello python,I am C++
3
[Finished in 0.2s]

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

Altdns:运用置换扫描技术的子域发现工具

Altdns是一款运用置换扫描技术的子域发现工具,它可以帮助我们查找与某些排列或替换匹配的子域。AltDNS接受可能存在于域下的子域中的单词(例如测试,开发,分...

2387
来自专栏Java 技术分享

Hibernate Session总结

1406
来自专栏Golang语言社区

Golang语言--select

Golang语言--select golang的select与channel配合使用。它用于等待一个或者多个channel的输出。 应用场景:主goroutin...

3537
来自专栏前端说吧

git-常用命令一览表

3809
来自专栏linux驱动个人学习

gitignore文件的作用

早上上传文件的时候,发现有一些密钥不需要增加到版本库中,但是由于每次git status都会提示Untracked files ...并且这些文件并不需要一直提...

3247
来自专栏Java 技术分享

Hibernate Session总结

3448
来自专栏李家的小酒馆

Linux基本命令

Linux 基本命令 下面为基本可以使用到的命令,只添加了一些常用的参数。 1.cd:切换目录 cd /root 2.mkdir:创建文件 mkdir /roo...

2500
来自专栏大数据

scrapy如何顺序执行多个爬虫

scrapy如何单线程顺序执行多个爬虫,刚开始我天真的以为将多个excute顺序罗列就能依次执行每个爬虫了,代码如下所示: ? 谁料,在执行完第一个爬虫之后,...

67210
来自专栏机器学习从入门到成神

Spring使用p名称空间配置属性

Spring的p标签是基于XML Schema的配置方式,目的是为了简化配置方式。

1601
来自专栏王二麻子IT技术交流园地

CentOS yum安装Apache + PHP + Tomcat7 + MySQL

可以参考下文在CentOS安装Apache + PHP + Tomcat7 + MySQL。 ---------------------------------...

8115

扫码关注云+社区

领取腾讯云代金券