【问题标题】:how to know if a process ended without locking the GUI?如何知道进程是否在没有锁定 GUI 的情况下结束?
【发布时间】:2013-04-12 22:34:03
【问题描述】:

我正在制作一个 python 接口来在 C 中运行一个程序,我需要知道这个 C 程序是否成功结束,但是我知道这样做的唯一方法是在 C 程序未完成时锁定接口。有谁知道我如何在不阻塞界面的情况下做到这一点?

下面是代码sn-p:

def runProg(self):
    """This funcion will run the simulation"""

    if self.openned.get() ==  1:
        self.pid = StringVar()
        a = open(self.nameFile.get(),"w")
        self.writeFile()

        self.process = subprocess.Popen([self.cmdSys.get()+self.dV.get()+
                                         self.extension.get(),self.nameFile.get()])
        self.pid = self.process.pid

        #isso trava a interface para processos muito grandes até que o mesmo tenha    terminado
        if self.process.wait() == 0:
            tkMessageBox.showinfo("","Your simulation was completed sucessfully.")

【问题讨论】:

    标签: python tkinter subprocess


    【解决方案1】:

    子进程Popen类有一个returncode属性,根据pydoc:

    None 值表示该进程 还没有终止。负值 -N 表示 child 被信号 N 终止(仅限 UNIX)。

    【讨论】:

      【解决方案2】:

      self.process.wait() 调用将阻塞,直到子进程结束,但是,正如您所发现的,如果您在主 GUI 线程中调用它,它将阻止您的 GUI 处理任何更多事件,直到发生这种情况。

      相反,您可以检查它是否以self.process.poll() 结束,如果进程仍在运行,它将立即返回None

      但是,如果您希望在子流程完成后发生某些事情,则必须设置某种定时事件来监控子流程。

      另一种选择是在后台线程中启动子进程,并改用阻塞wait() 方法。详情请见this question

      【讨论】:

        【解决方案3】:

        来自子进程模块documentation

        subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
        

        运行 args 描述的命令。等待命令完成,然后返回 returncode 属性。

        subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
        

        运行带有参数的命令。等待命令完成。如果返回码为零,则返回,否则引发 CalledProcessError。 CalledProcessError 对象将在 returncode 属性中包含返回码。

        所以我会使用subprocess.call()subprocess.check_call() 函数而不是subprocess.Popen()

        【讨论】:

          猜你喜欢
          • 2013-02-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-20
          相关资源
          最近更新 更多