Windows上Python使用swig呼叫C++

通訊程式猿發表於2019-03-25

 

安裝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

 

相關文章