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
編寫須要在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
在C++的空工程基礎上創建環境,在生成->配置管理器中設置:
活動解決方案配置
爲Release
活動解決方案平臺
爲X64
(本機爲64位機)在項目->屬性
中配置Python的庫
VC++目錄
中的包含目錄
中,導入Python安裝路徑下的include路徑(包含Python.h)連接器->常規
的附加庫目錄
中,導入Python安裝路徑下的libs路徑
選擇生成->生成解決方案
,在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