等到os.system命令完成

时间:2016-10-25 15:20:49

标签: python macos shell python-3.x command-line

我遇到了python脚本的问题。我正在使用python 3.我正在使用os.system函数在我的mac上打开一个应用程序。我想要做的是让计算机在打开完成后打印“完成”。问题是脚本在应用程序完成加载之前打印“完成”。应用程序开始启动但脚本在应用程序完成启动之前打印“已完成”。这是我的剧本:

import os

os.system('open "/Applications/Pages.app"')
print("done.")

Plz帮助

提前致谢

3 个答案:

答案 0 :(得分:0)

代码实际上正常工作。可能会将开启命令视为启动开启过程的事情 - 比如在汽车上启动启动马达。打开将告诉你的应用程序打开然后它返回,告诉你它是否已设法让球滚动。同时,您打开的应用程序将完成自己的初始化过程,直到它完全启动。

我不知道你的程序完全启动时你怎么知道只是设置一个任意秒数的计时器。您可以通过查看计算机上的进程列表进行有根据的猜测吗?

答案 1 :(得分:0)

open是一个命令,它将应用程序作为单独的任务运行。如果你想等待完成,你必须直接在应用程序内运行可执行文件(.app只是目录的后缀)。

但是你不想这样做:应用程序本身处理所有加载,MacOS(可能,我实际上不知道无论操作系统如何工作)只是复制所有从该可执行文件到RAM的位和字节;然后来自操作系统的调度程序运行它。

有些应用程序会直接打开一个窗口,但不是全部都可以。这样做的调用有时会运行在一些库中,通常需要一段时间。因此,尝试测量打开窗口所花费的时间也不起作用(应用程序也可以初始化其他内容;并且测量此类任务的时间并不是处理此类问题的好方法。)

解决方案如下:如果该程序打开一个窗口,您想要恢复,对吗?如果你知道这个过程的名字,那就很简单了:

import os
import subprocess

devnull = open(os.devnull, 'w')
script = """
tell application "System Events"
  set frontApp to first application process whose name is "{}" and frontmost is true
end tell
"""

...

while subprocess.check_call(["osascript", "-e", script.format("name_of_the_process")], stdout=devnull, stderr=devnull) != 0:
    pass

osascript运行AppleScript“应用程序”,在这种情况下,一个应用程序尝试使用您提供的名称获取进程,该名称必须有一个位于顶部的窗口。这是没有尾随“.app”的目录的名称,我猜。如果没有打开这个应用程序,这不起作用,给我们留下非零退出代码(在这种情况下为-1719),而如果应用程序打开它没有任何问题。设置变量,脚本退出,留下0作为退出代码。

如果您只想等待该过程出现,请从and frontmost is true变量中的AppleScript代码中删除script

我的代码在我的Mac上按预期工作,但它会打印到stdout。

答案 2 :(得分:0)

如果您真的想要您所描述的行为,我建议您查看UI自动化和OS X辅助功能的方向。例如 - 一个atomac python包可以帮助你等到它被加载。

1)您需要确定可通过UI自动化访问的已完成加载的“症状”。

2)等到出现“症状”。

3)你已经完成了。