2010-02-19 3 views
16

Ich kenne die Prozess-ID einer Anwendung in Mac OS X. Wie kann ich dazu wechseln (mit AppleScript oder Python oder was auch immer)?Wie aktiviere ich Mac OS X-Anwendungen mit einer bestimmten Prozess-ID?

Mit "Schalter", ich meine, in den Fokus stellen.

Die übliche Lösung ist die Verwendung des AppleScript-Codes tell application "Foo" activate, aber hier ist der Name nicht nützlich, weil ich viele Instanzen der gleichen Anwendung ausgeführt habe. Ich bin jedoch in der Lage, die Prozess-ID der Anwendung zu erhalten.

Wie kann ich programmgesteuert zu dieser Anwendung wechseln?

Antwort

10

Wenn Sie keine zusätzliche Software installieren möchten/können, gibt es eine integrierte Möglichkeit, nach Prozess-IDs und Apps zu suchen: ps.

ps ist ein nützliches Befehlszeilenprogramm, um Informationen zu laufenden Prozessen zu finden. Um eine bestimmte App zu finden die Prozessnummer gegeben (die ich auf eine Variable myProcessId zugewiesen haben):

do shell script "ps -p " & myProcessId 

dies ein Ergebnis wie dieses

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

geben das Ergebnis zu beschränken, um nur die relevanten Linie, über eine Pipe Sie den Namen der App finden Durch Parsen der Antwort wie so

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

grep. Dies kann ein wenig kompliziert sein, da das Ergebnis den eigentlichen Befehl anzeigt, der für die App verwendet wird, nicht den Namen der App (wenn Sie sich das Beispiel anschauen, können Sie es finden, indem Sie nach etwas.app im Ergebnis suchen) .

Edit - Entschuldigung, ich habe die Frage missverstanden.

Sie können es mit Systemereignissen tun (erweist sich als viel einfacher als mit der Schale faffing um sowieso):

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

Ich weiß das, aber es ist nicht interessant für mich. Wie ich bereits in meiner Frage erklärt habe, kenne ich den Namen der App bereits, aber es gibt mehrere davon. Die einzige Möglichkeit, zwischen ihnen zu unterscheiden, ist die Prozess-ID, die ich zufällig kenne. –

+0

oh, ich verstehe. Siehe die obige Bearbeitung. – stib

+3

+1 für den Filter 'when Unix-ID ist ...', aber es gibt keine Notwendigkeit für einen _loop_; ziele einfach auf den ersten Prozess, dessen Unix-ID ... ist. – mklement0

2

Hier ist meine Lösung, mit Python und Applescript:

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

Das ist es!

7

@stib's answer Werke, sondern vereinfacht werden:

Da durch Definition nur ein Prozess kann übereinstimmen - PIDs (Prozess-IDs) eindeutig identifizieren einen einzigen Prozess - es gibt keine Notwendigkeit für eine Schleife: einfach direkt die ersten - und per Definition nur - Element der Liste von PIDs durch das Filter zurück 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 beigetragen den folgenden bash Funktion wrapper:

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

Musteraufruf (nimmt an, dass activateByPid definiert wurde, oder in der aktuellen Shell bezogen):

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