码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 使用SWIG编写python的扩展


    环境:python3.8.5 ,64位,Visual Studio 2017,SWIG 4.0.2

    一,安装SWIG:https://www.swig.org/download.html

    下载windows 预编译好的文件,解压后把swig.exe所在目录添加到环境变量Path中,验证:

    打开cmd,敲入swig -help

    二,编写C++类,如:

    CppDll.h:

    1. #pragma once
    2. #include
    3. #include
    4. struct cppStruct
    5. {
    6. int a = 0;
    7. int b = 2;
    8. };
    9. class CppDllClass
    10. {
    11. public:
    12. int addFunc(int a, int b);
    13. std::string getName();
    14. void setName(std::string newname)
    15. {
    16. m_name = newname;
    17. }
    18. cppStruct getS()
    19. {
    20. auto a = cppStruct();
    21. a.a = 100;
    22. return a;
    23. }
    24. std::vector<int> getV()
    25. {
    26. std::vector<int> ret;
    27. ret.push_back(9);
    28. return ret;
    29. }
    30. // 如果成员变量要暴露给python,则改为public
    31. private:
    32. std::string m_name = "default name";
    33. };

    CppDll.cpp:

    1. #include "CppDll.h"
    2. int CppDllClass::addFunc(int a, int b)
    3. {
    4. return a+b;
    5. }
    6. std::string CppDllClass::getName()
    7. {
    8. return m_name + "tt";
    9. }

    三,编写.i文件:

    1. %include "std_string.i"
    2. %include "std_vector.i"
    3. using namespace std;
    4. namespace std {
    5. %template(IntVector) vector<int>;
    6. }
    7. %module CppDll
    8. %{
    9. #include "CppDll.h"
    10. %}
    11. %include "CppDll.h"

    保存到CppDll.cpp所在目录;

    关于更多模板类的使用,请参考:用SWIG向Python提供C++里STL的容器 · 零壹軒·笔记

    https://www.swig.org/Doc3.0/SWIGPlus.html

    四,打开cmd,进入CppDll.cpp所在目录,敲入:

    swig -python -c++ CppDll.i

    命令执行完后会在CppDll.cpp所在目录 生成CppDll_wrap.cxx、CppDll.py文件

    五,下一步编译成python能导入的模块文件(.pyd).

    新建一个.py文件,名字随意(必须是英文),例如compile.py,输入以下内容:

    1. from distutils.core import setup, Extension
    2. CppDll_module = Extension('_CppDll',
    3. sources=['CppDll_wrap.cxx', 'CppDll.cpp'],
    4. )
    5. setup (name = 'CppDll',
    6. version = '0.1',
    7. author = "beshar",
    8. description = """Simple swig example from docs""",
    9. ext_modules = [CppDll_module],
    10. py_modules = ["CppDll"],
    11. )

    这里模块名为CppDll,按照实际情况改为自己的模块名。

    六,打开cmd,进入compile.py所在目录,敲入:

    D:\ProgramData\anaconda3\python.exe compile.py build_ext --inplace

    我的机器上,命令执行成功后,会生成_CppDll.cp38-win_amd64.pyd,手动改为_CppDll.pyd

    七,验证C++模块

    打开cmd,cd到_CppDll.pyd所在目录,敲入python,进入python开发环境,然后导入模块并调用C++模块的函数:

    1. import CppDll
    2. class1 = CppDll.CppDllClass()
    3. class1.setName('name1')
    4. class1.getName()

    八,.pyd的也可以用vs来生成:

    新建一个c++ dll工程,把CppDll.cpp,CppDll_wrap.cxx添加到工程里,修改工程属性:

    由于安装python的时候没有安装Debug的库,因此这里使用Release配置。

    点击生成,即可生成.pyd文件。这一步可以替代上文的第五~第七步。 

  • 相关阅读:
    SVN -基础
    Linux 命令行——文本处理命令:cat、sort、uniq、cut、comm、diff、patch
    基于x86架构的CentOS7虚拟机通过qemu安装ARM架构CentOS7虚拟机
    超分辨率技术
    十二)Stable Diffussion使用教程:生成线稿
    NTP时钟同步服务器(卫星授时服务)在云计算数据机房的应用
    网络安全系列-三十一:基于kali系统安装CALDERA【建立在MITRE ATT&CK™之上的网络安全平台】
    SAP S4 FI后台详细配置教程- PART3 (财务凭证相关配置篇)
    【组成原理-存储】关于交叉存储器检测访问冲突的一种算法
    项目架构落地之需求分析(一)
  • 原文地址:https://blog.csdn.net/zhushentian/article/details/126102226
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号