You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 23:12:19