2010-05-31 13 views
9

Sto cercando di incorporare un AppleScript in uno script Python. Non voglio salvare l'AppleScript come file e quindi caricarlo nel mio script Python. C'è un modo per inserire AppleScript come una stringa in Python e avere Python per eseguire l'AppleScript? Grazie mille.Come incorporare un AppleScript in uno script Python?

Ecco il mio script: import sottoprocesso import re import os

def get_window_title(): 
    cmd = """osascript<<END 
    tell application "System Events" 
     set frontApp to name of first application process whose frontmost is true 
    end tell 
    tell application frontApp 
     if the (count of windows) is not 0 then 
      set window_name to name of front window 
     end if 
    end tell 
    return window_name 
    END""" 

    p = subprocess.Popen(cmd, shell=True) 
    p.terminate() 
    return p 

def get_class_name(input_str): 
    re_expression = re.compile(r"(\w+)\.java") 
    full_match = re_expression.search(input_str) 
    class_name = full_match.group(1) 
    return class_name 

print get_window_title() 
+0

Per vostra informazione, c'è un piccolo modulo Python su PyPI che fare il trucco: http://pypi.python.org/pypi/python-applescript/0.1 – ohe

risposta

20

Uso subprocess:

from subprocess import Popen, PIPE 

scpt = ''' 
    on run {x, y} 
     return x + y 
    end run''' 
args = ['2', '2'] 

p = Popen(['osascript', '-'] + args, stdin=PIPE, stdout=PIPE, stderr=PIPE) 
stdout, stderr = p.communicate(scpt) 
print (p.returncode, stdout, stderr) 
+1

In Python 3 questo non funzionerebbe, un parametro aggiuntivo universal_newlines = True sul popen è necessario. Vedere l'esempio qui sotto https://stackoverflow.com/a/45133926/1534775 – gbonetti

4

Esempio 3 in this article suggerisce:

#!/usr/bin/env python 
#sleepy-mac.py 
#makes my mac very sleepy 

import os 
cmd = """osascript -e 'tell app "Finder" to sleep'""" 
def stupidtrick(): 
    os.system(cmd) 
stupidtrick() 

questi giorni, tuttavia, subsystem.Popen è generalmente preferito su os.system (l'articolo è di tre anni fa, quando nessuno ha urlato nel vedere una chiamata os.system ;-).

+0

Ho guardato quel link prima, e ho non riuscivo a far funzionare il mio script. Ho modificato la mia domanda per includere lo script che sto cercando di eseguire. Penso che l'errore è che non riesco a recuperare il valore restituito da AppleScript. Ho esaminato l'oggetto Popen, ma non sono riuscito a trovare nulla per operare sui valori restituiti. – dbmikus

2

Invece di incorporare AppleScript, vorrei invece usare appscript. Non ho mai usato la versione Python, ma è stato molto bello in Ruby. And make sure that, if you're installing it on Snow Leopard, you have the latest version of XCode. Tuttavia, finora non sono riuscito a installarlo su Snow Leopard. Ma ho solo avuto Snow Leopard per ~ 1 giorno, quindi il tuo chilometraggio può variare.

+0

Siamo spiacenti di sentire che stai avendo problemi; dovrebbe funzionare (lo fa qui). Hai provato a pubblicare post su rb-appscript-discuss (http://rubyforge.org/mail/?group_id=2346) per assistenza? – has

+0

ha: Grazie per il collegamento, ma ho installato Snow Leopard solo 1.5 giorni fa, e ho trascorso oggi un viaggio; Non ho ancora provato molto duramente. Comunque, controllerò se non riesco a farlo funzionare; grazie ancora. –

+1

ha: E in effetti, tutto ciò che dovevo fare era [aggiornare XCode] (http://soenkerohde.com/2010/03/running-project-sprouts/). Grazie ancora, però! –

0

Ecco una funzione generica in python. Basta passare il codice AppleScript con/senza argomenti e recuperare il valore come stringa. Grazie alla risposta this.

from subprocess import Popen, PIPE 

def run_this_scpt(scpt, args=[]): 
    p = Popen(['osascript', '-'] + args, stdin=PIPE, stdout=PIPE, stderr=PIPE) 
    stdout, stderr = p.communicate(scpt) 
    return stdout 

#Example of how to run it. 
run_this_scpt("""tell application "System Events" to keystroke "m" using {command down}""") 

#Example of how to run with args. 
run_this_scpt(''' 
    on run {x, y} 
     return x + y 
    end run''', ['2', '2']) 
0

È possibile utilizzare os.system:

import os 
os.system(''' 
    osascript -e 
    '[{YOUR SCRIPT}]' 
    '[{GOES HERE}]' 
    ''') 

o, come suggerito da Alex Martelli è possibile utilizzare una variabile:

import os 
script = ''' 
    [{YOUR SCRIPT}] 
    [{GOES HERE}] 
''' 
os.system('osascript -e ' + script) 
3

in Python 3, sarebbe leggermente diverso:

script = 'tell "some application" to do something' 
p = Popen(['osascript', '-'], stdin=PIPE, stdout=PIPE, stderr=PIPE, universal_newlines=True) 
stdout, stderr = p.communicate(script) 

Popen ora si aspetta un oggetto simile a un byte, per passare una stringa, è necessario il parametro universal_newlines=True.

0

Ecco un semplice esempio sincrono python3, se si desidera che il codice Python non attenda il completamento di Applescript. In questo esempio, entrambi i comandi say vengono eseguiti in parallelo.

from subprocess import Popen 

def exec_applescript(script): 
    p = Popen(['osascript', '-e', script]) 

exec_applescript('say "I am singing la la la la" using "Alex" speaking rate 140 pitch 60') 
exec_applescript('say "Still singing, hahaha" using "Alex" speaking rate 140 pitch 66') 
Problemi correlati