python調用C++
python調用C++的方法有很多,筆者也試了很多但是不太好用
今天看到有人用swig來做封裝
安裝swig
$ sudo apt-get install swig
源文件
//test.h
int add(int a,int b);
int sub(int a,int b);
//test.cpp
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
test.i
//%module 后面的名字是被封裝的模塊名稱。封裝口,python通過這個名稱加載程序
//%{ %}之間所添加的內容,一般包含此文件需要的一些函數聲明和頭文件。
//最后一部分,聲明了要封裝的函數和變量,直接使用%include 文件模塊頭文件直接包含即可
//file test.i
%module test
%{
#include "test.h"
%}
%include "test.h"
執行命令編譯.i文件
$ swig -python -c++ test.i
此時會生成對應的文件: 模塊名_warp.cxx、模塊名.py
利用python提供的自動化編譯模塊進行編譯。編寫一個編譯文件setup.py
# setup.py
"""
setup.py file for SWIG example
"""
from distutils.core import setup, Extension
import numpy
test_module = Extension('_test', # #模塊名稱,必須要有下划線"_"必須有
sources=['test_wrap.cxx', 'test.cpp'], #封裝的cxx和源文件cpp
)
setup(name = 'test', #打包后的名稱
version = '0.1',
author = "zhangbo",
description = """Simple swig example from docs""",
ext_modules = [test_module], #與上面的擴展模塊名稱一致
py_modules = ["test"], #需要打包的模塊列表
)
利用python的執行setup.py文件
$ python setup.py build #編譯生成對應庫,可供python直接調用的模塊
實現過程如下所示:test模塊為通過編譯c++代碼生成test模塊,前面已經介紹c++代碼示例:
import test
print(test.add(3, 4))
Inference
[1] https://blog.csdn.net/qq_26105397/article/details/83153606
