使用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的扩展 的相关文章

  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • Python,多线程,获取网页,下载网页

    我想在一个站点批量下载网页 我的 urls txt 文件中有 5000000 个 url 链接 大约有300M 如何让多线程链接这些网址并下载这些网页 或者如何批量下载这些网页 我的想法 with open urls txt r as f
  • 如何在交互式绘图(Python)中获得鼠标指向的(x,y)位置?

    我使用 ipython 笔记本 带有魔法 matplotlib nbagg 我正在审查matplotlib widget Cursor但仅查看光标widgets Cursor http matplotlib org 1 4 3 exampl
  • 使 np.loadtxt 使用多个可能的分隔符

    我有一个程序可以读取数据文件 用户可以选择他们想要使用的列 我希望它对于输入文件更加通用 有时 列可能如下所示 10 34 24 58 8 284 6 121 有时它们可 能看起来像这样 10 34 24 58 8 284 6 121 我希
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • 使用 Python 脚本打开特定文件类型?

    如何使 Python 脚本成为特定文件类型 例如 foo 的默认应用程序 例如 当我双击 Finder Explorer 中的文件时 我希望该文件在 Python 脚本中打开 这可以在 Win 和 或 OS X 中实现吗 如果重要的话 该应
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • PlaySound 可在 Visual Studio 中运行,但不能在独立 exe 中运行

    我正在尝试使用 Visual Studio 在 C 中播放 wav 文件 我将文件 my wav 放入项目目录中并使用代码 PlaySound TEXT my wav NULL SND FILENAME SND SYNC 我按下播放按钮 或
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • Python 队列 get()/task_done() 问题

    我的消费者端队列 m queue get queue task done
  • 如何使用 pygame.mixer 重复音乐?

    我创建了以下使用 pygame mixer 播放 mp3 音乐的代码 然而 音乐不会重复 有什么想法可以让音乐重复播放吗 这是代码 playlist list playlist append put music here mp3 playl
  • Pip 突然使用了错误版本的 Python

    在 os x 上使用 pip 时遇到一个奇怪的问题 据我所知 快速查看我的 bash history 似乎可以确认 我最近没有对我的配置进行任何更改 唉 pip 命令似乎突然使用了与以前不同的 python 版本 到目前为止 我使用命令 p
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 在Python中从CSV文件中获取随机行并找到相应的单词,就像测验一样

    抱歉标题含糊不清 想不出更好的表达方式 我有一个包含德语 英语单词的 CSV 文件 如下所示 Ja Yes Nein No Katze Cat 我希望我的 python 脚本从 CSV 文件中打印一个随机的德语单词 并要求他们输入英语单词
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N
  • 使用 GhostScript.NET 打印 PDF DPI 打印问题

    我在用GhostScript NET http ghostscriptnet codeplex com打印 PDF 当我以 96DPI 打印时 PDF 打印效果很好 但有点模糊 如果我尝试以 600DPI 打印文档 打印的页面会被极大地放大
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个
  • django admin 中内联模型的分页器

    我有这个简单的 django 模型 由一个传感器和特定传感器的值组成 每个日射强度计的值数量很多 gt 30k 是否可以以某种方式分页PyranometerValues在特定日期或一般情况下将分页器应用于管理内联视图 class Pyran

随机推荐

  • 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