2010-02-19 14 views
16

Conozco la identificación del proceso de una aplicación en Mac OS X. ¿Cómo puedo cambiar a ella (usando applescript, python o lo que sea)?¿Cómo activar la aplicación Mac OS X con una ID de proceso determinada?

Por "cambiar", quiero decir, poner en foco.

La solución habitual es utilizar el código de applescript tell application "Foo" activate, pero aquí el nombre no es útil porque tengo muchas instancias de la misma aplicación ejecutándose. Sin embargo, puedo obtener la identificación del proceso de la aplicación.

¿Cómo puedo cambiar a esta aplicación mediante programación?

Respuesta

10

Si no desea/no puede instalar ningún software adicional, existe una forma integrada de buscar los ID de proceso y las aplicaciones: ps.

ps es una útil herramienta de línea de comandos para encontrar información sobre los procesos en ejecución. Para encontrar una aplicación particular, dado el número de proceso (que he asignado a un myProcessId variable):

do shell script "ps -p " & myProcessId 

este devolverá un resultado como este

PID TTY   TIME CMD 
66766 ??   9:17.66 /Applications/Firefox.app/Contents/MacOS/firefox-bin -psn_0_3793822 

para restringir el resultado de sólo el relevante línea, pipe it to grep como así

do shell script "ps -p " & myProcessId & "|grep " & myProcessId 

Al analizar la respuesta puede encontrar el nombre de la aplicación. Esto puede ser un poco complicado porque el resultado mostrará el comando real utilizado para la aplicación, no el nombre de la aplicación (si observa el ejemplo, verá que es posible encontrarlo buscando algo.app en el resultado) .

Editar - Disculpa, he entendido mal la pregunta.

Puede hacerlo con los eventos del sistema (que resulta ser mucho más fácil que faffing un poco con la cáscara de todos modos):

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 
+0

Lo sé, pero no es interesante para mí. Como ya expliqué en mi pregunta, ya sé el nombre de la aplicación, pero hay varias. La única forma en que puedo diferenciarlos es mediante la identificación del proceso, que por casualidad sé. –

+0

oh, ya veo. Ver la edición de arriba. – stib

+3

+1 para el filtro 'cuyo identificador de Unix es ...', pero no es necesario un _loop_; simplemente apunte al 'primer proceso cuyo ID de Unix es ...'. – mklement0

2

Aquí está mi solución, con el pitón y applescript:

  1. Instalar appscript
  2. Run appscript.app(pid=<yourpid>).activate()

Eso es todo!

7

@stib's answer obras, pero se puede simplificar:

Teniendo en cuenta que por definición solo one proceso puede coincidir - PIDs (identificaciones de proceso) identifican de forma única un único proceso - hay sin necesidad de un bucle: simplemente oriente directamente al primero - y por definición solamente - elemento de la lista de PIDs devueltos por filtro process whose unix id is ...:

# 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 contribuyó la siguiente bash función de contenedor:

# 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 
    " 
} 

llamada Muestra (supone que activateByPid se definió o de origen en el shell actual):

# Activate Safari by its PID. 
activateByPid $(pgrep -x 'Safari')