子流程.Popen有效,但任何等待(呼叫、等待、通信)都会导致“无响应”

2024-06-16 08:51:02 发布

您现在位置:Python中文网/ 问答频道 /正文

这是有效的:

def letsExecute():
    import subprocess
    subpr = subprocess.Popen("python " + codeFile + spacedout)

这会导致程序没有响应(我在windows上运行):

^{pr2}$

waitcommunicate基本上,任何让主进程等待子进程的操作都会导致相同的结果。我希望主进程在子进程成功完成时退出。在

另外,仅供参考:这个函数与一个tkinter按钮挂钩,这个程序使用tkinter GUI和mainloop()。不知道这是否会影响这个问题,但无论如何要让你知道。在

提前谢谢!在


Tags: import程序进程tkinterwindowsdefsubprocesspopen
2条回答

首先,为什么要尝试subprocess另一个python脚本,而只需导入它?在

总之,您的问题源于这样一个事实,即callwait和{}中的任何一个都等待{}的终止,如果timeout参数被赋值。由于这个原因,tkinter应用程序无法刷新自身,mainloop对于代码流是不可访问的。在

如果你脑子里有什么复杂的事情-看看^{}^{}和{a3}主题。在

如果您只想在子进程完成时终止主进程,请查看以下代码片段:

测试.py:

import time

time.sleep(5)

主.py:

^{pr2}$

这里的主要思想是保持mainloop对于使用^{}^{}方法组合的代码是可到达的。在

你的代码几乎没有问题。在

^{}

Run the command described by args. Wait for command to complete, then return the returncode attribute.

^{}^{}也是阻塞函数。在

请改用^{}。在

subpr = subprocess.Popen(["python", codeFile, spacedout])

while subpr.poll() is None:
    print("Still working...")
    time.sleep(0.1)

因为您希望GUI线程能够响应,所以可以在另一个线程上启动子进程。像这样的东西

^{pr2}$

相关问题 更多 >