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

为何用os.system()启动gnome计算器与终端时表现不同?

疑问:为什么os.system("gnome-terminal")不阻塞主进程,而os.system("gnome-calculator")会阻塞?

我的最终目标

我想从一个Python脚本启动另一个Python脚本——这个脚本会以Terminal作为GUI对话框询问文件名,我需要获取它退出时打印到终端的选定文件名。

我试过os.system()和subprocess.Popen()的各种用法,折腾了好几天查资料都没解决问题。进程间通信和标准输入输出重定向的相关机制实在搞不懂。

目前用os.system("gnome-terminal")可以不阻塞主Python脚本启动终端,还能通过PyAutoGUI在终端里启动目标脚本,但不知道怎么获取该脚本打印到命令行的结果。为了搞懂这个问题,我先想弄明白为什么启动不同程序时os.system()的阻塞行为不一样。

不阻塞的代码示例

import os, sys
os.system("gnome-terminal")
print('''OK after os.system("gnome-terminal") ''')
sys.exit()

这段代码会直接启动终端、打印内容并退出主脚本,完全不会被阻塞。

会阻塞的代码示例

import os, sys
os.system("gnome-calculator")
print('''OK after os.system("gnome-calculator") ''')
sys.exit()

这段代码会挂起,直到关闭计算器窗口后才会打印内容并退出主脚本。


更新:进程实例行为测试

根据提示,我尝试对比gnome-calculator、gnome-terminal和SciTE(同样不会阻塞主进程)的差异。看起来支持单实例多窗口的应用程序不会造成阻塞:gnome-terminal通过单个实例管理所有打开的窗口,当用shell命令启动新窗口时,调用的进程会很快退出,所以主脚本不会被阻塞;而gnome-calculator每次启动都会创建新实例,os.system()会一直等待这个实例退出才继续执行。

以下是我在shell中做的测试:

~ $ gnome-calculator &
[1] 18115
  ~ $ gnome-calculator &
[2] 18122
[1]   Done                    gnome-calculator
  ~ $ SciTE &
[3] 18141
[2]   Done                    gnome-calculator
  ~ $ SciTE &
[4] 18142
[3]   Done                    SciTE
  ~ $ SciTE &
[5] 18150
[4]   Done                    SciTE
  ~ $ SciTE
[5]+  Done                    SciTE
  ~ $ SciTE
  ~ $ SciTE
  ~ $ SciTE &
[1] 18183
  ~ $ SciTE &
[2] 18187
[1]   Done                    SciTE
  ~ $ gnome-terminal
[2]+  Done                    SciTE
  ~ $ 

最奇怪的是启动gnome-terminal之后,shell居然给出了SciTE的完成反馈(见最后三行)。

内容的提问来源于stack exchange,提问作者user7711283

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 20:45:39