2010-08-15 10 views

Répondre

11

this nice article suggère la solution simple

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

si aujourd'hui vous utiliseriez le module subprocess au lieu de os.system, bien sûr.

Assurez-vous de vérifier également page 2 de l'article pour beaucoup plus d'informations et d'options, y compris appscript.

+0

Si vous allez faire toute sorte d'Apple scripts d'événements non-trivial de Python, vous devriez utiliser appscript. C'est bien conçu, mature et bien soutenu. –

+0

@Ned, bien sûr, mais pour un but aussi simple et spécifique que l'appel d'un simple morceau d'applescript, le "truc stupide" de 'osascript -e' et 'subprocess.call', comme suggéré dans la page 1 de l'article (bien le article que je mentionne utilise l'ancien 'os.system', mais c'est un détail ;-) pourrait suffire. –

+0

Oh, Alex, je n'étais certainement pas en désaccord avec * vous *! –

5

Une version subprocess qui permet d'exécuter un script Apple original tel quel, sans avoir à échapper les guillemets et autres caractères qui peuvent être difficiles. C'est une version simplifiée du script trouvé here qui effectue également la paramétrisation et l'échappement correct (Python 2.x).

import subprocess 

script = '''tell application "System Events" 
    activate 
    display dialog "Hello Cocoa!" with title "Sample Cocoa Dialog" default button 2 
end tell 
''' 

proc = subprocess.Popen(['osascript', '-'], 
         stdin=subprocess.PIPE, 
         stdout=subprocess.PIPE) 
stdout_output = proc.communicate(script)[0] 
print stdout_output 

REMARQUE: Si vous devez exécuter plus d'un script avec la même instance Popen alors vous aurez besoin d'écrire explicitement proc.stdin.write(script) et lu avec proc.stdout.read() car communicate() fermera les flux d'entrée et de sortie.

+1

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

0

j'ai eu les gens de sortie ... Ici, il est ce qui suit:

import subprocess 
import sys 

for i in range(int(sys.argv[1])): 
    ip = str(sys.argv[2]) 
    username = str(sys.argv[3]) 
    pwd = str(sys.argv[4]) 

    script = '''tell application "Terminal" 
     activate 
     do script with command "cd Desktop && python test_switch.py {ip} {username} {pwd}" 
     delay 15 
    end tell 
    ''' 

    proc = subprocess.Popen(['osascript', '-'], 
         stdin=subprocess.PIPE, 
         stdout=subprocess.PIPE) 
    stdout_output = proc.communicate(script.format(ip=ip, username=username, pwd=pwd))[0]