Windows上Python使用swig调用C++

 

安装swig和VS

swig是一种可以将C++代码转换为多种脚本语言封装的工具,可以在http://www.swig.org/下载(Windows users should download swigwin-3.0.12 which includes a prebuilt executable. ),解压后将swig.exe的路径添加到环境变量path中即可使用swig。

我是电脑配置是win10,python3.6与VS2017。

 

C++代码

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

头文件example.h

#include <iostream>
using namespace std;

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

源文件example.cpp

#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>
  • %{...%}为附加的函数说明和头文件,源文件以外的部分都要包括在这里,包括头文件和宏定义等
  • 之后为要封装的函数或类,可以直接引用头文件(若已经将要封装的部分的声明写在头文件中)

example.i

%module Example_swig

%{
#include "example.h"
%}

%include "example.h"

在cmd下执行命令swig -python -c++ example.i

会生成两个文件:example_wrap.cxx和Example_swig.py

 

使用VS编译

在C++的空工程基础上建立环境,在生成->配置管理器中设置:

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

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

  • VC++目录中的包含目录中,导入Python安装路径下的include路径(包含Python.h)

  • 链接器->常规附加库目录中,导入Python安装路径下的libs路径

  • 另外要在常规->配置类型里选择动态库(.dll)

 

 

编译输出

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

测试调用

在python里,使用import <name>即可调用生成的文件(同一目录下)

 

windows下 tf-pose-estimation 测试安装环境,这里有用到swig,我自己的环境是win10,python3.6,当运行以下语句报错<无法打开包括文件: “numpy/arrayobject.h”: No such file or directory>时,参考https://blog.csdn.net/as472780551/article/details/83787882,修改C:\workspace\code\tf-pose-estimation-master\tf_pose\pafprocess路径下setup.py中添加一句include_dirs=[np.get_include()]即可

swig -python -c++ pafprocess.i && python setup.py build_ext --inplace
from distutils.core import setup, Extension
import numpy
import os

# os.environ['CC'] = 'g++';
setup(name='pafprocess_ext', version='1.0',
    ext_modules=[
        Extension('_pafprocess', ['pafprocess.cpp', 'pafprocess.i'],
                  swig_opts=['-c++'],
                  depends=["pafprocess.h"],
                  include_dirs=[numpy.get_include(), '.'])
    ],
    include_dirs=[numpy.get_include()],
    py_modules=[
        "pafprocess"
    ]
)

 

 

参考资料:

Windows平台下Python使用swig调用C++:https://www.jianshu.com/p/a257e630fe42

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值