为何用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
相关产品推荐
相关产品推荐

