Swig C++ Python PyQt

作为一名小白,老师要求作业代码用c/c++,然后用PyQt实现交互
找到两种方法:
1.在c++中调用python
这里出现两个问题:
一、python我安装的是anaconda,用c++调用python还需要调用自己写的python文件(将stdout重定向到PyQt控件),python文件关联到anaconda的某些库如numpy是没问题的,但是PyQt5不行,没有找到可行的解决办法。
二、代码写起来太麻烦,而且还需要学习Python.h里面的函数等等
2.python中调用c++
这种方法需要将c++封装为python的模块(使用swig),在这里又遇到了问题:
一、在封装c++为python模块时,总会出现问题
二、c++中cout可以在dos窗口显示,但是在anaconda环境下无法显示,重定向只支持print()函数
最后决定:
1.边写代码边调试,确保用python能够成功调用c++写的模块
2.传参后由python实现交互

Swig学习:
感谢该作者的文章
https://zhuanlan.zhihu.com/p/462193340

0.封装后的模块,可以任意添加成员变量
0.如果正确定义了全局变量,打包时也用%include全囊括了,但在py里,C++中定义的全局变量得用函数访问,就像private里面的变量。所以SWIG只能把C++函数、类做成接口,变量不行。但是全局变量还是在发挥作用的。
0.函数A调用函数B,可以只声明函数A(接口只做A的)。因为经过了编译,B也在发挥作用,但是你没有使用它的接口。
0.如果声明定义全在头文件(即只有.h没有.cpp),那setup.py中的sources就不需要写mod.cpp。
如果有很多cpp,在sources里面添加即可。但是cxx文件一定要有
0.如果有h配有cpp,且h中定义了全局变量,会编译不过去,因为会重复定义(
h被include了多次)。要把变量定义在cpp中,h中用extern。

STL模板

包名

%module name

头文件

%{
#include "example.h"
%}

库文件

写在头文件中不需要另外包含
但是某些库文件需要但单独包含swig库文件
%module example
%{
#include "example.h"
%}
// 用于支持vector
%include "std_vector.i"
// Instantiate templates used by example
namespace std {
   %template(IntVector) vector<int>;
   %template(DoubleVector) vector<double>;
}

// Include the header file with above prototypes
%include "example.h"

源文件中变量、函数需加 inline 与 extern关键字

/*变量*/
%inline %{
extern int  status;
extern char path[256];
%}
/*函数*/
%inline %{
extern void  pt_print();
%}

查阅官方文档,支持命名空间using、或者使用typedef

%include "std_vector.i"
namespace std {
    %template(IntVector) vector<int>;
}
using namespace std;
typedef std::vector Vector;
void foo(vector<int> *x, const Vector &x);
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rendy_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值