0

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

下面是代码片段:

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.")
4

3 回答 3

1

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

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

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

另一种选择是在后台线程中启动子进程,并改用阻塞wait()方法。有关详细信息,请参阅此问题

于 2013-04-19T14:24:11.653 回答
0

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

None 值表示该进程尚未终止。负值 -N 表示子进程被信号 N 终止(仅限 UNIX)。

于 2013-04-19T14:28:35.470 回答
0

从子流程模块文档

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-04-19T14:23:03.250 回答