Qt 调用外部 Python 脚本
Posted
技术标签:
【中文标题】Qt 调用外部 Python 脚本【英文标题】:Qt Calling External Python Script 【发布时间】:2013-02-28 03:43:08 【问题描述】:我正在尝试为我用 Python 编写的命令行工具之一编写 GUI 包装器。 有人建议我应该使用 Qt。
下面是我项目的 .cpp 文件:
#include "v_1.h"
#include "ui_v_1.h"
#include<QtCore/QFile>
#include<QtCore/QTextStream>
#include <QProcess>
#include <QPushButton>
v_1::v_1(QWidget *parent) :
QMainWindow(parent),ui(new Ui::v_1)
ui->setupUi(this);
v_1::~v_1()
delete ui;
void v_1::on_pushButton_clicked()
QProcess p;
p.start("python script -arg1 arg1");
p.waitForFinished(-1);
QString p_stdout = p.readAllStandardOutput();
ui->lineEdit->setText(p_stdout);
下面是我项目的头文件:
#ifndef V_1_H
#define V_1_H
#include <QMainWindow>
namespace Ui
class v_1;
class v_1 : public QMainWindow
Q_OBJECT
public:
explicit v_1(QWidget *parent = 0);
~v_1();
private slots:
void on_pushButton_clicked();
private:
Ui::v_1 *ui;
;
#endif // V_1_H
UI 文件只是一个 Push Button 和一个 LineEdit 小部件。
点击按钮时,我为按钮分配了一个插槽。 on_pushButton_clicked()
方法在我调用 ls
或 ps
之类的实用程序时工作正常,并将这些命令的输出通过管道传输到 LineEdit 小部件,但是当我尝试调用 Python 脚本时,它没有显示任何内容LineEdit 小部件。
任何帮助将不胜感激。
【问题讨论】:
我建议改用 PyQt,那样会更容易。 QPRocess 有 waitForStarted、waitForFinished() 的返回值,您可以读取 stderr 输出(类似于您读取 stdout 的方式),还有 QProcess::errorString()。先检查一下,看看出了什么问题。 【参考方案1】:您是否尝试过以下方法:
-
确保 python 在您的系统路径中
将文档中所述的参数作为 QStringList 传递
在测试时将 readAllStandardOutput 更改为 readAll
void v_1::on_pushButton_clicked()
QProcess p;
QStringList params;
params << "script.py -arg1 arg1";
p.start("python", params);
p.waitForFinished(-1);
QString p_stdout = p.readAll();
ui->lineEdit->setText(p_stdout);
【讨论】:
将文档中所述的参数作为 QStringList 传递 -> 你在哪里做这个?【参考方案2】:Hunor 的回答也对我有用。但我没有使用进程 ID。 我做到了:
void MainWindow::on_pushButton_clicked()
QString path = '/Somepath/mypath';
QString command("python");
QStringList params = QStringList() << "script.py";
QProcess *process = new QProcess();
process->startDetached(command, params, path);
process->waitForFinished();
process->close();
【讨论】:
【参考方案3】:对我来说,下面的代码有效:
void MainWindow::on_pushButton_clicked()
QString path = QCoreApplication::applicationDirPath();
QString command("python");
QStringList params = QStringList() << "script.py";
QProcess *process = new QProcess();
process->startDetached(command, params, path, &processID);
process->waitForFinished();
process->close();
path:您可以设置自己的路径 command:您要在哪个程序中运行(在本例中为 python)params :你要执行的脚本&processID是在主窗口关闭时杀死进程
【讨论】:
以上是关于Qt 调用外部 Python 脚本的主要内容,如果未能解决你的问题,请参考以下文章
SQL server 2012 是不是支持调用外部 python 脚本? [复制]