使用subprocess模块编写Python程序实现应用打开与关闭的问题求助
解决Safari启动后无法通过subprocess关闭的问题
嘿,我来帮你分析下问题出在哪,以及怎么解决~
你遇到的核心问题是:open -a safari这个命令本身只是个“启动器”进程——它的工作就是帮你启动Safari应用,一旦Safari成功启动,open进程就会立刻退出。所以你用subprocess.run或者Popen拿到的p对象,对应的是已经结束的open进程,而不是正在运行的Safari进程。这时候调用p.terminate()自然毫无效果,因为目标进程早就不在了。
Atom的Terminus插件和这个问题没关系,不用怀疑它~
下面给你两个可行的解决方案:
方案一:直接启动Safari的可执行文件
跳过open命令,直接调用Safari本身的可执行程序路径,这样Popen返回的就是Safari的进程实例,后续就能正常用terminate()关闭它了:
import time import subprocess # macOS下Safari的默认可执行文件路径 safari_path = '/Applications/Safari.app/Contents/MacOS/Safari' # 启动Safari p = subprocess.Popen([safari_path]) time.sleep(3) # 关闭Safari p.terminate()
方案二:通过进程名关闭Safari
如果你还是想用open命令启动,那可以通过查找Safari的进程ID(PID),再用pkill命令关闭它:
import time import subprocess # 用open启动Safari subprocess.run(['open', '-a', 'safari']) time.sleep(3) # 根据进程名关闭所有Safari进程 subprocess.run(['pkill', 'Safari'])
⚠️ 注意:pkill Safari会关闭所有名为Safari的进程,如果当时有多个Safari窗口在运行,都会被一起关掉。
这样就能实现你想要的“打开-延迟-关闭”的流程啦~
内容的提问来源于stack exchange,提问作者Ryan B. Jawad
相关产品推荐
相关产品推荐

