步驟0:swig簡介
swig是一種可以將C++代碼轉(zhuǎn)換為多種腳本語言封裝的工具只锻,可以在swig官網(wǎng)www.swig.org下載,解壓后將swig.exe的路徑添加到環(huán)境變量path中即可使用swig
步驟1:準(zhǔn)備C++代碼
編寫需要在Python中調(diào)用的C++代碼渡处,最好將函數(shù)和類的聲明統(tǒng)一放到頭文件中陵究,函數(shù)和類的實(shí)現(xiàn)放到源文件中
C++頭文件
頭文件主要包括:
-
#include
調(diào)用(例如#include <iostream>
) - 命名空間指定
using namespace std;
- 函數(shù)和類的聲明
#include <iostream>
using namespace std;
class example {
private:
int num;
public:
void say_hello(void);
void change(int din);
int get_num();
};
C++源文件
源文件為頭文件中函數(shù)和類的實(shí)現(xiàn)
#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封裝需要一個(gè).i
后綴文件的封裝說明僚害,其中
-
%module <name>
為封裝名稱缴饭,Python調(diào)用的包名就是<name>
-
%{...%}
為附加的函數(shù)說明和頭文件暑劝,源文件以外的部分都要包括在這里,包括頭文件和宏定義等 - 之后為要封裝的函數(shù)或類颗搂,可以直接引用頭文件(若已經(jīng)將要封裝的部分的聲明寫在頭文件中)
%module Example_swig
%{
#include "example.h"
%}
%include "example.h"
調(diào)用swig封裝
在命令行中輸入swig -python -c++ <swig_config>.i
担猛,其中<swig_config>.i
為上面寫的說明文件
swig -python -c++ example.i
調(diào)用后生成兩個(gè)文件:
- <cpp_source>_wrap.cxx文件
- <name>.py文件
步驟三:使用VS編譯
安裝VC140編譯器
python3.5使用的編譯器是VC140編譯器,對(duì)應(yīng)版本是VS2015,本次使用的是VS2017使用VC141編譯器傅联。需要在VS2017中安裝VC140編輯器先改,可以直接在工具->獲取工具和功能
中安裝
配置VS編譯環(huán)境
在C++的空工程基礎(chǔ)上建立環(huán)境
配置輸出類型
在生成->配置管理器
中設(shè)置:
-
活動(dòng)解決方案配置
為Release
-
活動(dòng)解決方案平臺(tái)
為X64
(本機(jī)為64位機(jī))
配置輸出
引入Python庫(關(guān)鍵)
在項(xiàng)目->屬性
中配置Python的庫
- 在
VC++目錄
中的包含目錄
中,導(dǎo)入Python安裝路徑下的include路徑(包含Python.h) - 在
鏈接器->常規(guī)
的附加庫目錄
中蒸走,導(dǎo)入Python安裝路徑下的libs路徑(注意不是Lib路徑仇奶,包括dll文件)
配置頭文件
配置庫
編譯輸出
選擇生成->生成解決方案
,在X64->Release文件夾下有一個(gè)dll文件载碌,即為編譯輸出的動(dòng)態(tài)鏈接庫猜嘱。將其名稱改為_<name>.pyd
(本例中為_Example_swig.pyd
)衅枫,將其與swig生成的<name>.py
文件放在同一目錄中
步驟四:測(cè)試調(diào)用
在python嫁艇,使用import <name>
即可調(diào)用剛才生成的包(同一目錄下)
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]