调用python脚本

经过踩坑无数,发现QProcess是最好的是实现方式。本方法windows/linux/mac 通用
其实不只是python,什么程序其实都可以。
首先确定本地已经安装好python环境,并知道python程序路径。
下面代码中包含两种方式

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QProcess>
#include <QtDebug>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
    ui->setupUi(this);
     process1 = new QProcess(this);
//方式一:首先调用控制台,再通过控制台启动程序。(控制台:mac/linux下调用bash,windows下是cmd.exe)
     process1->start("bash");//调用控制台程序
     process1->waitForStarted();//等待程序确实启动再往下走
     process1->write("ls\n");//输入查看当前目录的命令试试。加\n代表控制台中都回车。(查看当前目录命令:linux是 ls,windows 是dir)
     //启动python程序,运行指定py脚本。
     process1->write("/anaconda3/envs/AutoPilotServer/bin/python3.6 /Users/microduino/test000.py \n");
//方式2
     process1->start("/anaconda3/envs/AutoPilotServer/bin/python3.6");//直接启动python程序,而不是通过bash。
     process1->waitForStarted();//等待程序确实启动
     process1->write("/Users/microduino/test000.py \n");//输入python命令,要求他启动指定脚本。
	//信号槽连接,一旦获取到程序输出就调用OnReadData函数
     connect(process1,SIGNAL(readyReadStandardOutput()),this,SLOT(OnReadData()));
void MainWindow::OnReadData(){
	//打印出输出
    QString strResult = QString::fromLocal8Bit(process1->readAllStandardOutput().data());
    qDebug() << strResult;
MainWindow::~MainWindow()
	//别忘了 杀死调用的进程
    process1->kill();
    process1->close();
    delete  process1;
    delete ui;

值得指出的是,这里输出的内容,是当前py脚本运行结束后,有输出才会出发。比如脚本中有个循环10次每秒输出print,这里就不会触发10次分别打出print,而是会等10次运行结束后,统一打出文本。 。
解决办法,如果要想收到控制台的每次输出,可以再py脚本中将输出保存到内存中,或是剪切板,或者是指定的log文件,然后再通过qt读取,获取每次输出。

记录使用qt调用anoconda中的python 发生的问题们

D:\Anaconda3\envs\AutoPilot\include\object.h:448: error: expected unqualified-id before ';' token
     PyType_Slot *slots; /* terminated by slot==0. */

问题成因:

python中object库中的slots与qt中的关键字重合。slots是qt重要关键字,负责处理插槽功能。

解决办法:

打开python根目录/include/object.h文件 将问题代码slots 改为pySlots。以后在qt中调用python的slots时改用pySlots

F:\tools\qt\Tools\mingw730_64\lib\gcc\x86_64-w64-mingw32\7.3.0\include\c++\cmath:1136: error: '::hypot' has not been declared
   using ::hypot;
           ^~~~~

问题成因:

pyconfig 的 header file里hypot 被重命名为了 _hypot 。而 cmath 调用了 hypot

解决办法:

把include“math.h”放在include“Python”之前
在Python.h 开头加上math.h

import sys import qtawesome from PyQt5.QtCore import QObject, pyqtSignal, QEventLoop, QTimer, QThread, QTime from PyQt5.QtGui import QTextCursor from PyQt5.QtWidget
QT调用python脚本时遇到的坑(十一大坑全有)https://blog.csdn.net/herr_kun/article/details/84570258 qt调用python脚本 https://www.pianshen.com/article/949127711/ 报 LNK1104 无法打开文件 “python38_d.lib”参考https://blog.csdn.net/ZChen1996/article/details/115998472 QT多线程调用python https://blo
import time from PyQt5 import QtGui, QtWidgets from PyQt5.QtCore import QObject, pyqtSignal from PyQt5.QtWidgets import QMa 最近项目需要调用别人写的python程序,所以在网上找了一些QT调用python的资料,个人感觉挺简单的吧,自己写了一个Demo测试了一下。 2 python环境部署 python下载地址:https://www.python.org/downloads/ 可以下载自己需要的版本,但是在下载的时候需要注意是32位还是64位,要看你使用的QT是32位还是64位的, 然后... self.text_update.emit(str(text)) # loop = QEventLoop() # QTimer.singleShot(100, loop.quit) # loop.exec
前言: 由于项目的需求需要在开发的上位机上调用python脚本     项目需求:QT需要调用python脚本进行开发,但是开始入门的时候按照网上的教程进行一个简单的hello程序都会出错,下面来记录一下。 位数的坑:       首先因为做的项目要调用一个仪器的动态链接库,而那个动态链接库的位数是32位的,并且是VS编译生成的,所以我选的QT就是MSVC32位编译器,这就导致了后面的问题...
如有侵权,请联系删除。 一、拟解决问题 在训练神经网络时,每个epoch的详细信息会出现在控制台上让我们查看,但是在开发软件时训练神经网络模型我们没办法看到控制台输出信息,这时如果能够捕获print的打印信息,将其现在在多行文本编辑器里就可以解决了。 二、实行方案 1. stdout重定向 from io imp
Qt Designer,可以通过将按钮的clicked信号连接到一个槽函数来触发事件调用Python脚本。以下是一个示例: 1. 在Qt Designer创建一个按钮,并给它命名为"btnRunScript"。 2. 在代码导入PyQt5的QtCore和QtWidgets模块。 ```python from PyQt5.QtCore import * from PyQt5.QtWidgets import * 3. 创建一个继承自QMainWindow的类,并在其定义一个槽函数来处理点击按钮事件: ```python class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.ui = Ui_MainWindow() self.ui.setupUi(self) self.ui.btnRunScript.clicked.connect(self.runScript) def runScript(self): # 在这里写Python脚本的代码 print("Python脚本已运行") 4. 最后,使用uic.loadUi函数加载UI文件,并实例化MainWindow类: ```python if __name__ == '__main__': app = QApplication(sys.argv) mainWindow = MainWindow() mainWindow.show() sys.exit(app.exec_()) 这样,在点击按钮时,就会调用runScript函数,并执行Python脚本的代码。
unity的错误解决办法:NullReferenceException: Object reference not set to an instance of an object;tiny proje 13475