使用SWIG编写python的扩展

2023-11-10

环境: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:

#pragma once
#include <string>
#include <vector>
struct cppStruct
{
    int a = 0;
    int b = 2;
};
class CppDllClass
{
public:
    int addFunc(int a, int b);
    std::string getName();
    void setName(std::string newname)
    {
        m_name = newname;
    }
    cppStruct getS()
    {
        auto a = cppStruct();
        a.a = 100;
        return a;
    }
    std::vector<int> getV()
    {
        std::vector<int> ret;
        ret.push_back(9);
        return ret;
    }

    // 如果成员变量要暴露给python,则改为public
private:
    std::string m_name = "default name";
    

};

CppDll.cpp:

#include "CppDll.h"

int CppDllClass::addFunc(int a, int b)
{
    return a+b;
}

std::string CppDllClass::getName()
{
    return m_name + "tt";
}

三,编写.i文件:


%include "std_string.i"
%include "std_vector.i"
using namespace std;

namespace std {
  %template(IntVector) vector<int>;
}
%module CppDll
%{
#include "CppDll.h"
%}
%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,输入以下内容:

from distutils.core import setup, Extension
 
CppDll_module = Extension('_CppDll',
                           sources=['CppDll_wrap.cxx', 'CppDll.cpp'],
                           )
setup (name = 'CppDll',
       version = '0.1',
       author      = "beshar",
       description = """Simple swig example from docs""",
       ext_modules = [CppDll_module],
       py_modules = ["CppDll"],
       )

这里模块名为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++模块的函数:

import CppDll
class1 = CppDll.CppDllClass()
class1.setName('name1')
class1.getName()

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用SWIG编写python的扩展 的相关文章

随机推荐

  • element中手动图片上传,附带完整代码

    先展示一张图片效果图片 这种上传时 很常见的 之所以写这篇文章的目的时记录一下 和之前完全不同的上传方式 之前的上传方式 由于
  • 2023华为OD机试Java【报数问题】

    题目 最开始的时候 有100个同学 每个同学都有一个编号 从一到一百 所有的人围城一圈 报数的规则是 从 1 开始报数 如果某个报数为 M 那么他就退出游戏 他的下一个人从 1 重新开始报数 如果最后的人数小于M 则停止游戏 请你计算最后剩
  • 分类、目标检测、语义分割、实例分割的区别

    计算机视觉的任务很多 有图像分类 目标检测 语义分割 实例分割和全景分割等 那它们的区别是什么呢 1 Image Classification 图像分类 图像分类 下图左 就是对图像判断出所属的分类 比如在学习分类中数据集有人 person
  • Redis压力测试——redis-benchmark

    1 redis benchmark简介 redis benchmark是官方自带的Redis性能测试工具 用来测试Redis在当前环境下的读写性能 在使用Redis的时候 服务器的硬件配置 网络状况 测试环境都会对Redis的性能有所影响
  • MATLAB矩阵的值,迹,秩,范数,上三角矩阵,下三角矩阵,主对角线元素

    设A为矩阵 det A 求矩阵的值 trace A 求矩阵的迹 rank A 求矩阵的秩 norm A 求矩阵的范数 norm A 1 求矩阵的1范数 norm A inf 求矩阵的无穷范数 diag A 求主对角线元素 diag详细用法
  • java中获取泛型参数详解【全网最详细】

    java中所有的类型都继承自Type其中包括Class类也是继承自它 另外它还有四个重要的子类 ParameterizedType表示是个带泛型的类型 如List
  • android 触摸屏校准软件,触摸屏软件(eGalaxTouch)下载_触摸屏软件(eGalaxTouch)官方下载-太平洋下载中心...

    eGalaxTouch是一款电子触摸屏驱动程序 电子触摸屏幕有时候是需要校准一下才能准确获取坐标点 这款软件可以帮助我们校准触摸屏参数 推荐有需要的用户下载使用 校准方法 1 下载 安装eGalaxTouch Android板子连接液晶屏
  • 线性表链式储存(图书管理系统)

    线性表链式储存和顺序储存各有优点 该笔记的一些说法是自己的理解 并不官方 首先我们要创建一个结构体用来储存书籍的相关属性信息 我称为数据结构体 储存一组待储存的数据 typedef struct book string bnum 书的编号
  • n个结点的无向完全图的生成树的个数

    头部闲扯 今天闲来在google搜了一下cantjie 突然发现我的博客竟然被引用过 很是惊讶 因为虽然仅仅只是过去一年 我现在看我去年写的博客 就有种 这写的什么垃圾玩意 的感觉 没想到竟然也会有人浏览并引用我的博客 想来这个博客闲置一年
  • Win10如何查看Nvidia支持的CUDA版本

    打开设置 在搜索里输入控制面板 打开控制面板 点击 硬件和声音 选项 然后选择Nvidia面板 在Nvidia面板中点击帮助 选择系统信息 选择组件 找到 NVCUDA DLL 即可看到支持的CUDA版本
  • 递归算法应用并使用分页

    递归算法应用并使用分页 直接上代码 注释很全 自己看 public List
  • eclipse中JUnit的使用

    一 JUnit单元测试概述 JUnit是一个Java语言的单元测试框架 JUnit有它自己的JUnit扩展生态圈 多数Java的开发环境都已经集成了JUnit作为单元测试的工具 Junit是一套框架 继承TestCase类 因此可以用Jun
  • java.io.FileNotFoundException: File does not exist: hdfs://xxx

    一 产生问题背景 我们公司正在准备从cdh迁回社区版hadoop集群 启动flink任务的时候 还未运行就直接报错 Caused by org apache flink yarn YarnClusterDescriptor YarnDepl
  • C#+sqlserver+asp.net婚纱影楼管理系统

    一 源码描述 这是一款简洁十分美观的ASP NET sqlserver源码 界面十分美观 功能也比较全面 比较适合 作为毕业设计 课程设计 使用 感兴趣的朋友可以下载看看哦 二 功能介绍 该源码功能十分的全面 具体介绍如下 婚纱影楼管理系统
  • ECEF和ENU坐标之间的转换

    转载 https gssc esa int navipedia index php Transformations between ECEF and ENU coordinates 1 定义 ENU coordinates local Ea
  • 我的第一个Java程序

    没想到从纯前端转到了JAVA Web 首先第一个 JAVA程序 计算图形面积 使用工厂模式和反射机制实现 Illegal modifier for the interface method paraNeed only public abst
  • redis高可用与集群实战案例

    一 配置redis主从 主备模式 可以实现 Redis 数据的跨主机备份 程序端连接到高可用负载的VIP 然后连接到负载服务器设置的Redis后端 real server 此模式不需要在程序里面配置 Redis 服务器的真实 IP 地址 s
  • vba17-25

    十七 变量默认值 简写变量 常量 1声明变量的同时赋值 数值 0 字符串 空字符串 布尔 False 变体 Empty 空 2 布尔值 false 0 True 1 所有非0的数字转换成布尔类型都是True 3变量定义简写 dim i in
  • 区块链基本特性

    区块链具有去中心化 不可篡改 不可逆 匿名等特性 去中心化 因为整个网络没有中心统治者 系统依靠的是网络上多个参与者的公平约束 所以任意每几个节点的权利和义务都是均等的 而且每一个节点都会储存这个区块链上所有数据 即使该节点被损坏或遭受攻击
  • 使用SWIG编写python的扩展

    环境 python3 8 5 64位 Visual Studio 2017 SWIG 4 0 2 一 安装SWIG https www swig org download html 下载windows 预编译好的文件 解压后把swig ex