关于python:从GUI运行脚本

Run script from GUI

我写了一个用于数据分析的脚本(test.py)。现在我在Pyqt中做一个图形用户界面。我想要的是当我按下"运行"按钮时,脚本test.py将运行并显示结果(绘图)。

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

下面的脚本不完整(有更多的按钮和函数关联,但不相关,也无法连接到所描述的问题)。

我在spyder和pyqt5上使用python 3.6。

是否有其他功能或模块可以满足我的需求?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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_()


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

使用此选项,如何使一个python文件运行另一个文件?


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

试试看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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_()

enter image description here


您需要做的是创建一个文本标签,然后将stdout/stderr管道连接到subprocess.PIPE

1
2
3
4
5
6
p = subprocess.Popen(
   "python test1.py",
    shell=True,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE
)

然后打电话给subprocess.Popen.communicate()

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