sierra puedo pro mojave macbook mac capitan apple actualizar macos applescript

macos - puedo - mac os mojave



¿Cómo activar la aplicación Mac OS X con un ID de proceso dado? (3)

Conozco el identificador de proceso de una aplicación en Mac OS X. ¿Cómo puedo cambiarlo (usando AppleScript, Python, o lo que sea)?

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

La solución habitual es usar el código de AppleScript para activar la tell application "Foo" activate , pero aquí el nombre no es útil porque tengo muchas instancias de la misma aplicación en ejecución. Sin embargo, soy capaz de obtener el ID de proceso de la aplicación.

¿Cómo puedo cambiar a esta aplicación programáticamente?


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

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

¡Eso es!


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 herramienta de línea de comandos útil para encontrar información sobre los procesos en ejecución. Para encontrar una aplicación en particular dado el número de proceso (que he asignado a una variable myProcessId):

do shell script "ps -p " & myProcessId

esto 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 solo a la línea correspondiente, canalícelo a grep 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 en el resultado). .

Editar - lo siento, entendí mal la pregunta.

Puedes hacerlo con los eventos del sistema (resulta ser mucho más fácil que andar con el shell 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


La respuesta de @ stib funciona, pero puede simplificarse:

Dado que, por definición, solo un proceso puede coincidir: los PID (ID de proceso) identifican de forma única un solo proceso; no hay necesidad de un bucle: simplemente se dirige directamente al primer elemento , y solo por definición, de la lista de PID devueltos por el process whose unix id is ... 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ó con la siguiente envoltura de la función 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 " }

Llamada de ejemplo (se supone que se ha definido o se ha activateByPid BrianBid en el shell actual):

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