我知道Mac OS X中应用程序的进程ID。如何切换到它(使用applescript,python或其他)?
通过“切换”,我的意思是,把焦点放在一边。
通常的解决方案是使用applescript代码tell application "Foo" activate
,但这里的名称没用,因为我有许多同一个应用程序运行的实例。然而,我能够获得应用程序的进程ID。
如何以编程方式切换到此应用程序?
答案 0 :(得分:9)
如果您不想/无法安装任何其他软件,可以通过内置方式查找进程ID和应用程序:ps。
ps是一个有用的命令行工具,用于查找有关正在运行的进程的信息。要根据进程号(我已将其分配给变量myProcessId)查找特定应用程序:
do shell script "ps -p " & myProcessId
这会返回像这样的结果
PID TTY TIME CMD
66766 ?? 9:17.66 /Applications/Firefox.app/Contents/MacOS/firefox-bin -psn_0_3793822
将结果限制在相关的行,将其管道为grep,如此
do shell script "ps -p " & myProcessId & "|grep " & myProcessId
通过解析答案,您可以找到该应用程序的名称。这可能有点棘手,因为结果将显示用于应用程序的实际命令,而不是应用程序名称(如果您查看示例,您将看到可以通过在结果中查找something.app来找到它)
编辑 - 抱歉,我误解了这个问题。
你可以使用系统事件来做到这一点(原来比使用shell更容易):
tell application "System Events"
set theprocs to every process whose unix id is myProcessId
repeat with proc in theprocs
set the frontmost of proc to true
end repeat
end tell
答案 1 :(得分:7)
@stib's answer有效,但可以简化:
根据定义,只有一个进程可以匹配 - PID(进程ID)唯一标识一个进程 - 不需要循环:只需直接定位 - 按照定义仅 - 元素过滤器process whose unix id is ...
返回的PID列表:
# Assumes that variable `myProcessId` contains the PID of interest.
tell application "System Events"
set frontmost of the first process whose unix id is myProcessId to true
end tell
ehime提供了以下bash
函数包装器:
# Pass the PID as the 1st (and only) argument.
activateByPid()
{
osascript -e "
tell application \"System Events\"
set frontmost of the first process whose unix id is ${1} to true
end tell
"
}
示例调用(假设在当前shell中定义或来源activateByPid
):
# Activate Safari by its PID.
activateByPid $(pgrep -x 'Safari')
答案 2 :(得分:2)
这是我的解决方案,使用python和applescript:
appscript.app(pid=<yourpid>).activate()
就是这样!