SWIG 把 c++ 转化为 Python

26 篇文章 0 订阅

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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值