从 GUI 运行脚本

Posted

技术标签:

【中文标题】从 GUI 运行脚本【英文标题】:Run script from GUI 【发布时间】:2018-04-20 09:10:39 【问题描述】:

我为数据分析编写了一个脚本 (test.py)。现在我在 PyQt 中做一个 GUI。 我想要的是当我按下“运行”按钮时,脚本 test.py 将运行并显示结果(图)。

我尝试了subprocess.call('test1.py')subprocess.Popen('test1.py'),但它只打开脚本而不运行它。 我也试过os.system,也不行。

下面的脚本不完整(有更多的按钮和功能相关但不相关,也没有连接到所描述的问题)。

我在 Spyder 和 PyQt5 上使用 Python 3.6。

还有其他功能或模块可以做我想做的吗?

class Window(QMainWindow):

    def __init__(self):
        super(Window, self).__init__()
        self.setGeometry(50, 50, 500, 300)
        self.setWindowTitle("TEMP FILE")

        self.home()

    def home (self):
        btn_run = QPushButton("Run", self)
        btn_run.clicked.connect(self.execute)

        self.show()

    def execute(self):
        subprocess.Popen('test1.py', shell=True)
        subprocess.call(["python", "test1.py"])

if not QtWidgets.QApplication.instance():
    app = QtWidgets.QApplication(sys.argv)
else:
    app = QtWidgets.QApplication.instance()

GUI = Window()
app.exec_()

【问题讨论】:

您的意思是要捕获并显示程序的输出吗? 正确,显示程序的输出。 以后,我想用GUI,我可以选择我想运行的程序。这也可能吗? 当然,但我们不只是为您编写代码。看看PyQt5 reference guide。 当然。现在我只是尝试了几种方法来做到这一点,我不明白为什么它不起作用。我正在检查那个指南。谢谢。 【参考方案1】:

您需要做的是创建一个文本标签,然后通过管道将 stdout / stderr 发送到 subprocess.PIPE:

p = subprocess.Popen(
    "python test1.py",
    shell=True,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE
)

然后拨打subprocess.Popen.communicate():

stdout, stderr = p.communicate()
# Display stdout (and possibly stderr) in a text label

【讨论】:

还是不行,可能是我的软件有问题,因为如果我直接将代码粘贴到 GUI 脚本中,它将完美运行。【参考方案2】:

您可以随时导入 test1.py 并从中调用函数

使用这个How can I make one python file run another?

【讨论】:

也试过了,但只能用一次。当我第二次单击按钮时,脚本不会运行。 我建议您在问题中添加您尝试过的事情以及您遇到的问题【参考方案3】:

QProcess 类用于启动外部程序并与它们进行通信。

试试看:

import sys
import subprocess

from PyQt5 import Qt
from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton
from PyQt5.QtCore import QProcess

class Window(QMainWindow):
    def __init__(self):
        super(Window, self).__init__()
        self.setGeometry(50, 50, 500, 300)
        self.setWindowTitle("TEMP FILE")
        self.home()

    def home (self):
        btn_run = QPushButton("Run", self)
        #btn_run.clicked.connect(self.execute)                                   # ---
        filepath = "python test1.py"                                             # +++
        btn_run.clicked.connect(lambda checked, arg=filepath: self.execute(arg)) # +++

        self.show()

    def execute(self, filepath):                                         # +++
        #subprocess.Popen('test1.py', shell=True)
        #subprocess.call(["python", "test1.py"])

        # It works
        #subprocess.run("python test1.py")

        QProcess.startDetached(filepath)                                 # +++



if not QApplication.instance():
    app = QApplication(sys.argv)
else:
    app = QApplication.instance()

GUI = Window()
app.exec_()

【讨论】:

还是不行,可能是我的软件有问题,因为如果我将代码直接粘贴到 GUI 脚本中,它将完美运行。

以上是关于从 GUI 运行脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何从具有 PySide2 GUI 的 python 脚本构建一个 mac os 应用程序?

使用非GUI模式运行jmeter测试脚本

从 Bash 或 Perl 脚本运行 SQL 语句?

如何停止运行没有 GUI 窗口的 Python .pyw 脚本?

如何在 linux 中显示来自 bash 脚本的 GUI 消息框?

从 python 脚本调用 python 脚本,提供输入和获取输出,PyQt5,GUI