如何使用Tkinter正确生成子进程并退出?

时间:2018-01-31 00:46:54

标签: python tkinter popen

我正在尝试使用Tkinter编写一个简单的python(3.7)程序,在单击按钮时,它将生成一个进程并终止Python脚本。生成的过程不应该被杀死。以下代码实现了这一点:

from tkinter import *
import subprocess
import time

def execute_command(command):
    process = subprocess.Popen(command, stdout = subprocess.PIPE, 
            stderr = subprocess.STDOUT, shell=True,
            universal_newlines = True)

class App:
    def __init__(self, master):
        self.frame = Frame(master)
        self.frame.pack()

        self.button_gimp = Button(self.frame, text = "GIMP", command = self.gimp)
        self.button_gimp.pack(side = LEFT)

    def gimp(self):
        execute_command("gimp")
        self.frame.quit()

root = Tk()
app = App(root)
root.mainloop()
root.destroy()
time.sleep(5)

但是,如果最后没有sleep(),则进程(在本例中为GIMP)将在打开之前被终止。关于这里发生了什么的任何想法?我知道Popen是异步的,但是一旦它返回,应该保证生成进程,即使python终止,不应该吗?它甚至有自己的PID,可以打印。

更新::

在John Anderson的带领下,我发现了这一点 stdout = subprocess.PIPE是罪魁祸首。我很欣赏任何有关原因的见解,因为这只是告诉Popen捕获过程的输出。

0 个答案:

没有答案