2010-05-31 6 views
9

J'essaie d'intégrer un AppleScript dans un script Python. Je ne veux pas avoir à sauvegarder l'AppleScript en tant que fichier, puis le charger dans mon script Python. Est-il possible d'entrer l'AppleScript en tant que chaîne en Python et Python peut-il exécuter l'AppleScript? Merci beaucoup.Comment intégrer un AppleScript dans un script Python?

Voici mon script: import subprocess 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

Pour votre information, il y a un petit module python sur PyPI qui font l'affaire: http://pypi.python.org/pypi/python-applescript/0.1 – ohe

Répondre

20

Utilisation 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

En python 3 cela ne fonctionnerait pas, un paramètre supplémentaire universal_newlines = True sur le popen est nécessaire. Voir l'exemple ci-dessous https://stackoverflow.com/a/45133926/1534775 – gbonetti

4

Exemple 3 this article suggère:

#!/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() 

Ces jours-ci, cependant, subsystem.Popen est généralement préférée à os.system (l'article date d'il y a trois ans, quand personne n'a crié en voyant un appel os.system ;-).

+0

Je regardais ce lien avant, et je Je n'arrivais pas à faire fonctionner mon script. J'ai édité ma question pour inclure le script que j'essaie d'effectuer. Je pense que l'erreur est que je ne peux pas récupérer la valeur de retour de l'AppleScript. J'ai regardé dans l'objet Popen, mais je n'ai rien trouvé à opérer sur les valeurs de retour. – dbmikus

2

Plutôt que d'intégrer AppleScript, j'utiliserais à la place appscript. Je n'ai jamais utilisé la version Python, mais c'était très bien dans Ruby. And make sure that, if you're installing it on Snow Leopard, you have the latest version of XCode. Cependant, j'ai été jusqu'à présent incapable de l'installer sur Snow Leopard. Mais j'ai seulement eu Snow Leopard pour ~ 1 jour, donc votre kilométrage peut varier.

+0

Désolé d'apprendre que vous rencontrez des problèmes; ça devrait marcher (c'est ici). Avez-vous essayé de poster sur rb-appscript-discuss (http://rubyforge.org/mail/?group_id=2346) pour obtenir de l'aide? – has

+0

a: Merci pour le lien, mais j'ai seulement installé Snow Leopard il y a 1,5 jours, et j'ai passé aujourd'hui voyager; Je n'ai pas vraiment essayé très dur pour le moment. Pourtant, je vais vérifier si je ne peux pas le faire fonctionner; Merci encore. –

+1

a: Et en effet, tout ce que je devais faire était [mettre à jour XCode] (http://soenkerohde.com/2010/03/running-project-sprouts/). Merci encore! –

0

Voici une fonction générique en python. Transmettez simplement le code de votre applescript avec/sans args et récupérez la valeur sous forme de chaîne. Merci à this réponse.

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

Vous pouvez utiliser os.system:

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

ou, comme suggéré par Alex Martelli, vous pouvez utiliser une variable:

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

En python 3, il serait légèrement différent:

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 s'attend maintenant à un objet de type octet, pour passer une chaîne, le paramètre universal_newlines=True est nécessaire.

0

Voici un exemple synchrone python3 simple, si vous voulez que votre code python n'attend pas la fin d'Applescript. Dans cet exemple, les deux commandes say sont exécutées en parallèle.

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')