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。python

我是電腦配置是win10,python3.6與VS2017。ios

 

C++代碼

編寫須要在Python中調用的C++代碼,最好將函數和類的聲明統一放到頭文件中,函數和類的實現放到源文件中c++

頭文件example.hwindows

#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.iui

%module Example_swig

%{
#include "example.h"
%}

%include "example.h"

在cmd下執行命令swig -python -c++ example.ispa

會生成兩個文件:example_wrap.cxx和Example_swig.py.net

 

使用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