为何sys.exit()在subprocess.run()和subprocess.call()中无法生效?
问题:为什么subprocess.call()/run()无法关闭原进程,只有Popen()可以?
我想要实现打开第二个Python文件并关闭第一个进程。试了subprocess的三种方法:subprocess.call()、subprocess.run()和subprocess.Popen(),发现只有Popen()能正常工作——它允许sys.exit()真正关闭第一个进程;而call()和run()虽能打开第二个文件,但第一个进程会卡住,无法关闭。示例代码如下:
import tkinter as tk import subprocess import sys def start_newFile(): subprocess.call((sys.executable, 'testing2.py')) sys.exit() root = tk.Tk() root.title("First Script") # Button to start a new file start_button = tk.Button(root, text="Start New File", command=start_newFile) start_button.pack() root.mainloop()
原因解析
核心差异在于三个函数的执行模式:
subprocess.call()和subprocess.run()是阻塞式调用:它们启动子进程(testing2.py)后,会一直等待子进程完全运行结束,才会继续执行后续的sys.exit()代码。这就导致第一个进程卡在call()/run()这一步,直到你手动关闭第二个程序,才会触发退出逻辑,所以看起来像是卡住了。subprocess.Popen()是非阻塞式调用:它启动子进程后会立刻返回,不会等待子进程结束,所以紧接着就能执行sys.exit(),直接关闭第一个进程,而第二个进程会独立继续运行。
如果非要用call()或run()实现类似效果,可以添加start_new_session=True参数(让子进程脱离父进程控制),但最直接且推荐的方式还是用Popen()——它本身就是为异步启动子进程设计的。
内容的提问来源于stack exchange,提问作者Chris Bustamante
相关产品推荐
相关产品推荐

