SWIG 把 c++ 转化为 Python
说明
SWIG is a program that helps wrap C/C++ code so it can be called from higher-level languages
支持的语言:
>swig -help
Supported Target Language Options
-csharp - Generate C# wrappers
-d - Generate D wrappers
-go - Generate Go wrappers
-guile - Generate Guile wrappers
-java - Generate Java wrappers
-javascript - Generate Javascript wrappers
-lua - Generate Lua wrappers
-octave - Generate Octave wrappers
-perl5 - Generate Perl 5 wrappers
-php7 - Generate PHP 7 or later wrappers
-python - Generate Python wrappers
-r - Generate R (aka GNU S) wrappers
-ruby - Generate Ruby wrappers
-scilab - Generate Scilab wrappers
-tcl8 - Generate Tcl 8 wrappers
-xml - Generate XML wrappers
下载
https://www.swig.org/download.html
win系统下载
swigwin-x.x.x
解压,然后把 swig.exe 目录添加到环境变量Path
pyswiglib.h
#ifndef PYSWIGLIB_H
#define PYSWIGLIB_H
#include "PySwigLib_global.h"
#include <string>
class PySwigLib
{
public:
PySwigLib();
~PySwigLib();
void fu1(std::string str);
void fu2(int pa,float f);
};
#endif // PYSWIGLIB_H
pyswiglib.cpp
#include "pyswiglib.h"
#include<iostream>
using namespace std;
PySwigLib::PySwigLib()
{
std::cout<<__func__<<endl;
fflush(stdout);
}
PySwigLib::~PySwigLib()
{
std::cout<<__func__<<endl;
fflush(stdout);
}
void PySwigLib::fu1(string str)
{
std::cout<<__func__<<str<<endl;
fflush(stdout);
}
void PySwigLib::fu2(int pa,float f)
{
std::cout<<__func__<<"pa:"<<pa<<" f:"<<f<<endl;
fflush(stdout);
}
新建文件 pyswiglib.i
/* File : pyswiglib.i */
%module pyswiglib
%{
#include "pyswiglib.h"
#include <string>
#include <iostream>
%}
/* Let's just grab the original header file here */
%include "pyswiglib.h"
使用 swig 生成 pyswiglib_wrap.cxx pyswiglib.py
其中 pyswiglib.py 是需要python导入的模块
pyswiglib_wrap.cxx 是需要编译成库文件的c++封装
swig -python -c++ -outdir "./lib" pyswiglib.i
-outdir “./lib” 是表示 把生成的 pyswiglib.py 文件放到当前路径 ./lib 目录下
编译c++代码成库文件
PySwigLib.pro
CONFIG -= qt
TEMPLATE = lib
#DEFINES += PYSWIGLIB_LIBRARY
CONFIG += c++11
#库名称 _pyswiglib
TARGET = _pyswiglib
SOURCES += \
pyswiglib.cpp \
pyswiglib_wrap.cxx
HEADERS += \
PySwigLib_global.h \
pyswiglib.h \
pyswiglib.i
DISTFILES += \
test.py
#python包含目录和连接python库
INCLUDEPATH += "D:\\software\\Python\\Python39\\include\\"
QMAKE_LIBDIR += "D:\\software\\Python\\Python39\\libs"
LIBS += -lpython3 \
-lpython39 \
-l_tkinter
#生成库路径
DESTDIR =$$PWD/lib
编译生成_pyswiglib.dll 文件
复制 _pyswiglib.dll 依赖文件到 lib目录
打开 vs 命令行 工具 : Develpoer Command Prompt for VS 2022
输入命令
dumpbin /DEPENDENTS D:\workspace\Python\PySwigLib\lib\_pyswiglib.dll
依赖文件如下:
libgcc_s_seh-1.dll
KERNEL32.dll
msvcrt.dll
USER32.dll
libstdc++-6.dll
python3.dll
python39.dll
找到全部复制到 lib目录D:\workspace\Python\PySwigLib\lib
可以安装 everything 工具查找文件
把_pyswiglib.dll 文件重命名为 _pyswiglib.pyd
test.py 是测试代码
import sys
sys.path.append("./lib")
from lib.pyswiglib import *
import sys
import ctypes
try:
mycls = PySwigLib()
mycls.fu1(ctypes.c_buffer("11"))
#mycls.fu2(2,3)
except Exception as e:
print(e)
输出:
PySwigLib
11
~PySwigLib