Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >SWIG:避免C++到Python混叠

SWIG:避免C++到Python混叠
EN

Stack Overflow用户
提问于 2020-08-04 23:57:17
回答 1查看 117关注 0票数 0

我正在C++中构建一个库,该库使用4.0.1与Python3进行接口。经过一段时间的发展,我注意到一个问题(我认为这是所谓的)别名。我准备了一个最小的例子,这也发生了。

考虑具有单个(私有)属性dummy的类attr,该属性在0处初始化。现在,我有了一个非常小的python脚本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import dummy_wrap
d1 = dummy_wrap.dummy()
d2 = d1
d1.set_attr(12)
print(d2.get_attr()) # this prints '12', not '0'

我希望我所说的混叠是这里真正发生的事情:对象d2从未被修改过,但是它接受给d1的值,就好像赋值d2=d1实际上是指针赋值一样。我想要发生的事情(以及我希望发生的事情)是赋值操作符a=bb的硬拷贝传递给a。换句话说,对a的修改不应影响b,反之亦然,只要这符合实现细节(如我的库和最小示例中的情况)。

最后,这是我在编译时得到的消息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
g++ -fPIC -c dummy.cpp
g++ -fPIC -shared -o libdummy_lib.so dummy.o
swig -Wall -c++ -python -py3 -o dummy_wrap.cxx dummy_wrap.i
dummy.hpp:10: Warning 362: operator= ignored
dummy.hpp:11: Warning 362: operator= ignored
dummy.hpp:7: Warning 509: Overloaded method dummy::dummy(dummy &&) effectively ignored,
dummy.hpp:6: Warning 509: as it is shadowed by dummy::dummy(dummy const &).
g++ -fPIC -c dummy_wrap.cxx -I /usr/include/python3.8
g++ -fPIC -shared -o _dummy_wrap.so dummy_wrap.o -L . -ldummy_lib -lpython3.8

问题:

我想了解这里发生了什么,以及为什么:dummy& operator=(const dummy&)

  • Is和dummy(dummy&&)是否会影响到SWIG包装dummy(const dummy&)dummy(const dummy&)的方式?可以合理地预期我希望拥有的默认行为,即:这是类在使用SWIG与python接口后的预期行为吗?

  • 如何修复这个问题:我应该做哪些更改以使操作符=生成一个硬拷贝?

F 228>

提前谢谢。

为了复制这一点,类头dummy.hpp是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#pragma once

class dummy {
    public:
        dummy() = default;
        dummy(const dummy&) = default;
        dummy(dummy&&) = default;
        ~dummy() = default;
        dummy& operator=(const dummy&) = default;
        dummy& operator=(dummy&&) = default;
        void set_attr(int v);
        int get_attr() const;
    private:
        int attr = 0;
};

类实现dummy.cpp是简单的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "dummy.hpp"
void dummy::set_attr(int v) { attr = v; }
int dummy::get_attr() const { return attr; }

接口文件dummy_wrap.i是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%module dummy_wrap
%{
#include "dummy.hpp"
%}
%include "dummy.hpp"

我用来编译和链接所有东西的Makefile

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
all: libdummy_lib.so _dummy_wrap.so
_dummy_wrap.so: dummy_wrap.o
    g++ -fPIC -shared -o _dummy_wrap.so dummy_wrap.o -L . -ldummy_lib -lpython3.8
dummy_wrap.o: dummy_wrap.cxx
    g++ -std=c++17 -fPIC -c dummy_wrap.cxx -I /usr/include/python3.8
dummy_wrap.cxx: dummy_wrap.i
    swig -Wall -c++ -python -py3 -o dummy_wrap.cxx dummy_wrap.i
libdummy_lib.so: dummy.o
    g++ -fPIC -shared -o libdummy_lib.so dummy.o
dummy.o: dummy.cpp dummy.hpp
    g++ -std=c++17 -fPIC -c dummy.cpp
clean:
    rm -f libdummy_lib.so dummy.o
    rm -f _dummy_wrap.so dummy_wrap.o dummy_wrap.cxx dummy_wrap.py

在linux中,请记住使用以下方法更新LD_LIBRARY_PATH

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-05 22:26:56

因此,多亏了最初文章中的一些注释,一个可能的解决方案是添加一个clone()方法。可以通过简单地扩展C++头来实现这一点。但是,由于这在某些人看来可能很奇怪,因为在许多情况下,clone()方法在C++中根本没有必要,所以我们可以使用SWIG扩展python类。简单地以示例中的dummy_wrap.i为例,并在文件末尾添加以下代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%extend dummy {
    dummy clone() const {
        return *$self;
    }
}

不幸的是,这并没有在这里结束,因为我们的python代码必须修改:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import dummy_wrap
d1 = dummy_wrap.dummy()
d2 = d1.clone()
d1.set_attr(12)
print(d2.get_attr()) # now this prints '0'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63260754

复制
相关文章
图像抗混叠
算法:图像抗混叠通常是在向下采样之前通过平滑图像(通过图像与低通滤波器的卷积,如高斯滤波器)来完成的。混叠是图像中有一些在原始图像中不存在的黑色斑点或伪影。下采样对于缩小图像的效果并不是太理想,因为它会产生混叠效果。通常是因为采样率比奈奎斯特速率小(像素太少了的缘故),因此避免混叠的一种方法是增加采样率,使其大于奈奎斯特速率。
裴来凡
2022/05/28
8120
图像抗混叠
Windows平台下Python使用swig调用C++
步骤0:swig简介 swig是一种可以将C++代码转换为多种脚本语言封装的工具,可以在swig官网www.swig.org下载,解压后将swig.exe的路径添加到环境变量path中即可使用swig 步骤1:准备C++代码 编写需要在Python中调用的C++代码,最好将函数和类的声明统一放到头文件中,函数和类的实现放到源文件中 C++头文件 头文件主要包括: #include调用(例如#include <iostream>) 命名空间指定using namespace std; 函数和类的声明 #i
月见樽
2018/04/27
2.1K0
Windows平台下Python使用swig调用C++
Python中的SWIG入门
SWIG (Simplified Wrapper and Interface Generator,简化封装和接口生成器) 是一个开源工具,用于将C/C++代码转换为各种高级编程语言的接口代码。它允许开发人员在Python等脚本语言中直接使用底层的C/C++代码,以提高开发效率和灵活性。
大盘鸡拌面
2023/10/17
6140
python swig 调用C/C++接口
当你觉得python慢的时候,当你的c/c++代码难以用在python上的时候,你可能会注意这篇文章。swig是一个可以把c/c++代码封装为python库的工具。(本文封装为python3的库)
用户5760343
2022/05/13
7470
python swig封装c/c++成Python库
//------------------------------------------------------------------------
用户5760343
2022/05/14
5780
swig 语法介绍
loop.index: The current iteration of the loop (1-indexed)
为为为什么
2022/08/05
6080
SWIG与nodejs入门
Javascipt是一种基于原型的脚本语言。它是动态的,弱类型的语言。它可以说是最流行的Web开发语言。Javascript已经超越了基于浏览器的脚本语言,并且与node.js一起,它也被用作后端开发语言。
音视频_李超
2020/04/01
2K0
SWIG与nodejs入门
SWIG 官方文档第四部分 - 机翻中文人肉修正
包装 C 库时出现的一个常见问题是保持可靠性和检查错误。事实是,许多 C 程序因不提供错误检查而臭名昭著。不仅如此,当您将应用程序的内部结构公开为库时,通常可以通过提供错误的输入或以非预期的方式使用它而使其崩溃。
韩伟
2021/09/03
5.4K0
python snowboy安装(一)
Snowboy,KITT.AI开发的人工智能软件工具包。通过Snowboy软件,开发人员可以在一些硬件设备上添加 “语音热词探测” 功能。KITT.AI 宣称,Snowboy 能够让人们轻松地将语音控制功能添加到自己的硬件设备上。
李小白是一只喵
2020/04/23
2.7K0
python snowboy安装(一)
python+C、C++混合编程的应用
TIOBE每个月都会新鲜出炉一份流行编程语言排行榜,这里会列出最流行的20种语言。排序说明不了语言的好坏,反应的不过是某个软件开发领域的热门程度。语言的发展不是越来越common,而是越来越专注领域。有的语言专注于简单高效,比如python,内建的list,dict结构比c/c++易用太多,但同样为了安全、易用,语言也牺牲了部分性能。在有些领域,比如通信,性能很关键,但并不意味这个领域的coder只能苦苦挣扎于c/c++的陷阱中,比如可以使用多种语言混合编程。
py3study
2020/01/03
2.1K0
python+C、C++混合编程的应用
HDOJ 2074 叠筐
Problem Description 需要的时候,就把一个个大小差一圈的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机来完成,得看你的了。
谙忆
2021/01/20
2820
python打包二进制文件(pyd\dll\exe)
使用cython编译pyx文件输出c和h文件(带cdef public等定义才会输出头文件),pyx添加
sofu456
2022/03/07
3.3K0
python打包二进制文件(pyd\dll\exe)
SWIG 官方文档第二部分 - 机翻中文人肉修正
本章简要概述了 C++11 标准的 SWIG 实现。SWIG 的这一部分仍在进行中。
韩伟
2021/09/03
2.3K0
5. 数码相机内的图像处理-图像采样与金字塔
你有没有见过下面这张图像上那种神秘的彩色纹路?我们知道这件灰色衬衣本身应该是光滑的,为什么拍出来的照片上会有这样的纹路呢?
HawkWang
2020/04/17
1.2K0
5. 数码相机内的图像处理-图像采样与金字塔
SWIG 官方文档第三部分 - 机翻中文人肉修正
很有可能,您正在阅读本章是出于以下两个原因之一;您要么想自定义 SWIG 的行为,要么无意中听到有人嘟囔着一些关于“typemaps”的难以理解的胡言乱语,然后问自己“typemaps,那些是什么?” 也就是说,让我们先做一个简短的免责声明,即“Typemaps”是一种高级自定义功能,可以直接访问 SWIG 的低级代码生成器。不仅如此,它们还是 SWIG C++ 类型系统(它自己的一个重要主题)的组成部分。typemaps 通常不是使用 SWIG 的必需部分。因此,如果您已经找到了进入本章的方法,并且对 SWIG 默认情况下已经做了什么只有一个模糊的概念,那么您可能需要重新阅读前面的章节。
韩伟
2021/09/03
3.6K0
【深度学习系列】关于PaddlePaddle的一些避“坑”技巧
最近除了工作以外,业余在参加Paddle的AI比赛,在用Paddle训练的过程中遇到了一些问题,并找到了解决方法,跟大家分享一下: ---- PaddlePaddle的Anaconda的兼容问题   之前我是在服务器上安装的PaddlePaddle的gpu版本,我想把BROAD数据拷贝到服务器上面,结果发现我们服务器的22端口没开,不能用scp传上去,非常郁闷,只能在本地训练。本机mac的显卡是A卡,所以只能装cpu版本的,安装完以后,我发现运行一下程序的时候报错了: 1 import paddle.v2
Charlotte77
2018/03/19
1.1K0
你试过C语言和Python一起混合编程吗?两者相加不是已经无敌了!
本文介绍了如何利用Python的Cython和SWIG库进行C/C++与Python的交互,以及编译Python扩展和创建Python模块。
企鹅号小编
2017/12/27
1.6K0
你试过C语言和Python一起混合编程吗?两者相加不是已经无敌了!
TensorFlow架构与设计:会话生命周期
作者:刘光聪 ,中兴通讯高级系统架构师,专注机器学习算法,分布式系统架构与优化。 原文:TensorFlow架构与设计:会话生命周期(http://www.jianshu.com/p/667cbb20d802) 责编:王艺 CSDN AI记者,投稿、寻求报道、深入交流请邮件wangyi@csdn.net或扫描文末二维码添加微信。 相关文章: 图解TensorFlow架构与设计 TensorFlow架构与设计:图模块 TensorFlow的系统结构以C API为界,将整个系统分为「前端」和「后端」两个
用户1737318
2018/06/06
1.4K0
天津大学研究团队提出基于源混叠矩阵估计的稳态视觉诱发电位扩增方法
针对稳态视觉诱发电位(steady-state visual evoked potential, SSVEP)识别面临的校准数据不足的问题,天津大学神经工程团队提出了一种源混叠矩阵估计方法(source aliasing matrix estimation, SAME)来扩增SSVEP信号的校准数据。在Benchmark和BETA公开数据集上的结果表明,当与SAME方法结合后,两种先进的空间滤波方法(eTRCA, TDCA)在校准数据不足的情况下均有显著的性能提高。SAME可以有效扩增基于稳态视觉诱发电位的脑机接口系统的校准数据,从而减少系统的校准负担,相关研究成果在实用型脑机接口方面具有潜在的应用价值,已在线发表至《IEEE Transactions on Biomedical Engineering》期刊。
脑机接口社区
2023/02/14
8640
天津大学研究团队提出基于源混叠矩阵估计的稳态视觉诱发电位扩增方法
让WebStorm支持swig文件语法高亮
WebStorm中没有swig插件,我们可以用另一个插件“twig”替代,方法如下:
飞奔去旅行
2019/06/13
1.2K0
让WebStorm支持swig文件语法高亮

相似问题

C++混叠矢量

11

严格混叠规则与C++中的类型混叠

10

C++型混叠问题

11

如何避免WPF中的反混叠?

20

如何避免这种ImageMagick抗混叠变色?

34
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文