作为一名小白,老师要求作业代码用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。
包名
%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);