labview和python混编,labview matlab混合编程

  labview和python混编,labview matlab混合编程

  项目使用夸脱搭建了一个数据库软件,这个软件还需要有一些数据分析、特征重要度计算、性能预测等功能,而大蟒的机器学习第三方库比较成熟,使用起来也比较便捷,因此这里需要用到Qt(c ) python混合编程,在此记录一下相关方法与问题,以方便自己与他人。

  本项目使用的是QtCreator(Qt5.5.0)搭建。其他版本只要版本是正确对应的,都大同小异。

  文章目录准备工作夸脱调用大蟒脚本大蟒文件q矢量转巴拉圭对象类型夸脱调用大蟒脚本在夸脱项目中调用` kde.py 的“情节”函数显示图像(有输入,无返回值):在夸脱项目中调用` kde.py 的`加载数据函数读取本地数据(无输入,有返回值): 注意事项参考:

  准备工作

  假设你已经正确安装了夸脱和python,由于夸脱中的时间关键字与大蟒重复,这里我们需要修改一下文件./Anaconda/include/object.h(注意先将原文件备份):

  原文件(448行):

  typedef struct { const char * nameint basicsizeint itemsize无符号整数标志;PyType _ Slot * slots/*由插槽==0终止. PyType _ Spec修改为:

  typedef struct { const char * nameint basicsizeint itemsize无符号整数标志;#undef插槽//这里取消时间宏定义PyType _ Slot * slots/*由插槽==0终止。*/#定义插槽Q_SLOTS //这里恢复时间宏定义与夸脱中QObjectDefs.h中一致} PyType _ Spec完成上述工作后我们需要在。赞成文件中加入大蟒的路径信息(我的大蟒路径是Y:/Anaconda):

  include path=-I Y:/Anaconda/include libs=-LY:/Anaconda/libs-lpython 36将python3.dll,python36.dll,python36。pywintypes36.dll放到。可执行程序的扩展名目录下。

  夸脱调用大蟒脚本大蟒文件创建一个大蟒脚本放在释放;排放;发布项目目录下,这里我们新建了一个kde.py,其中包含无返回值函数plotKDE(x,column,kernel,algorithm,width _ first,bw,leaf_size,atol,rtol,title)用于绘制核K桌面环境曲线与直方图和有返回值函数loadData()用于读取本地。战斗支援车文件,图像绘制效果如下所示:

  kde.py部分代码如下(为方便表达,后续步骤中我们将plotKDE函数简写为plotKDE(x,column,kernel)):

  import CSV import OSI import matplotlib as mplfrom matplotlib import py plot as pltim port numpy as NP from sk learn。邻居impl。使用( tka gg )mpl。RC params[ font。sans-serif ]=[ sim hei ]mpl。RC params[轴。unicode _ MINUS ]=false BASE _ DIR=OS。路径。dirname(_ _ file _ _)file _ path=OS。路径。加入(BASE _ DIR, train.csv )定义整形(-1,1) x=np.mat(x).整形(-1,1) fig,ax=PLT。支线剧情()kde=内核密度(带宽=bw,算法=算法,内核=内核,atol=atol,rtol=rtol,width _ first=width _ first,leaf_size=leaf_size).拟合(x)log _ dens=kde。分数_样本(x _ plot)轴。hist(x,density=True,color=浅蓝色)ax。plot(x _ plot[:0],NP。exp(log _ dens))PLT。标题(标题[栏])。show()def load data():x=[]with open(file _ path, rt )as CSV file:reader=CSV。reader中第行的reader(CSV文件):tmp=list(map(float,line[4:]))转巴拉圭对象类型此处新建了一个类用于将夸脱中存储的数据的QVectordouble类型等转换为用于大蟒脚本的某个东西类型QVectorQVectordouble .的转换方法可以此类推。

  py object * Utility:Utility function:convertLabelData(QVectordouble * labels){ int labelSize=labels-size();py object * pArgs=PyList _ New(标签大小);for(int I=0;我贴标签;i) { PyList_SetItem(pArgs,I,Py_BuildValue(d ,(* labels)[I]);}退货包装;} Qt调用大蟒脚本在夸脱项目中调用kde.py的plotKDE函数显示图像(有输入,无返回值): //初始化py _ Initialize();如果(!py _ is initialized()){ printf( initial ize失败);qDebug()"初始化失败";返回;}else { qDebug()初始化成功;}//加载模块,即loadtraindata。pypy object * p module=py import _ import模块( kde );如果(!p模块){ PyErr _ Print();qDebug()未加载!;返回;}else { qDebug()加载模块成功;}//QVectordouble pKDE中存放了选中列的所有数据py object * pKDEdata=Utility:Utility function:convertLabelData(pKDE);//类型转换py object * pArg=py tuple _ New(3);PyTuple_SetItem(pArg,0,pKDEdata);//int列表示选中的列的索引PyTuple_SetItem(pArg,1,Py_BuildValue(i ,列));//Qstring内核表示核类型PyTuple_SetItem(pArg,2,Py_BuildValue(s ,kernel.toStdString()).c _ str()));//加载函数loadData()py object * pf unc=py object _ GetAttrString(p module, plot kde );如果(!pFunc) { printf(get func失败!);} else { qDebug() get func success ;}PyObject_CallObject(pFunc,pArg);py _ DECREF(p模块);py _ DECREF(p func);py _ Finalize();在夸脱项目中调用kde.py的加载数据函数读取本地数据(无输入,有返回值):Py _ Initialize();QVectorQVectordouble *列车数据;//存储大蟒脚本读入的数据如果(!py _ is initialized()){ printf( initial ize失败);qDebug()"初始化失败";返回;}else { qDebug()初始化成功;}//添加当前路径(读文件的时候才需要)pyron _ simple string( import sys );pyron _ simple string( sys。路径。追加(./));//加载模块,即loadtraindata。pypy object * p module=py import _ import模块( kde );如果(!p模块){ PyErr _ Print();qDebug()未加载!;返回;}else { qDebug()加载模块成功;}//加载函数load data()p object * pLoadFunc=p object _ GetAttrString(p module, load data );如果(!pLoadFunc) { printf(get func失败!);} else { qDebug() get func success ;} py object * retObjectX=py object _ call object(pLoadFunc,NULL);//获得大蟒脚本返回数据if (retObjectX==NULL) { qDebug()无返回值;返回;}/*将retObjectX导入列车数据中(二维数据)*/int row=PyList _ Size(retObjectX);for(int I=0;我划船;I){ py object * line object=PyList _ GetItem(retObjectX,I);int col=PyList _ Size(line对象);QVectordouble tmpVectfor(int j=0;j colj){ py object * single item=PyList _ GetItem(line object,j);double item=py float _ as double(单项);tmp向量。push _ back(项);}列车数据-push _ back(tmp vect);} Py _ Finalize();注意事项这里列写一下软件搭建过程中遇到的问题,以供参考。

  重装大蟒的话别忘了修改。赞成文件中的大蟒路径;导入错误:dll未加载:

  常见的马特普罗特里布努皮等动态链接库加载错误,通常是由大蟒与对应的第三方包的版本不一致导致的。将水蟒文件下的python.dll和python3.dll文件拷贝到夸脱可执行文件可执行程序的扩展名同级目录下并覆盖。多次调用Py_Initialize()和Py_Finalize()可能会出现异常:

  最好在主页面里就输入Py_Initialize(),程序最后再py _ Finalize();32位电脑中打开程序报错:Appcrash异常代码40000015。出现这个问题时应在系统环境变量中创建一个名为PYTHONHOME,值为E:\Anaconda(蟒蛇安装地址)的变量,并在小路中增加变量$PYTHONHOME$和$ PYTHONHOME $ \脚本即可参考:[1] QT与计算机编程语言混合编程经验记录:http://www。cnblogs。com/贾平/p/6321859。超文本标记语言

  [2] C调用大蟒浅析:https://博客。csdn。net/魔童/文章/详情/8947892

  本博客与https://xuyunkun.com同步更新

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: