2010-08-15 29 views

risposta

11

this nice article suggerisce la soluzione più semplice

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

se oggi devi usare il modulo subprocess invece di os.system, naturalmente.

Assicuratevi di controllare anche page 2 dell'articolo per molte più informazioni e opzioni, tra cui appscript.

+0

Se hai intenzione di fare qualsiasi tipo di scripting di Apple Event non banale da Python, si dovrebbe utilizzare appscript. È ben progettato, maturo e ben supportato. –

+0

@Ned, certo, ma per uno scopo così semplice e specifico come chiamare un semplice bit di applescript, lo "stupido trucco" di 'osascript -e' e' subprocess.call', come suggerito nella pagina 1 dell'articolo (bene il l'articolo come menzionato usa il vecchio 'os.system', ma quello è un dettaglio ;-) potrebbe bastare. –

+0

Oh, Alex, certamente non ero in disaccordo con * tu *! –

5

Una versione subprocess che consente di eseguire uno script Apple originale così com'è, senza dover evitare citazioni e altri caratteri che possono essere complicati. Si tratta di una versione semplificata dello script trovato here che esegue anche la parametrizzazione e l'escaping corretto (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 

NOTA: Se è necessario eseguire più di uno script con la stessa istanza Popen allora avrete bisogno di scrivere in modo esplicito con proc.stdin.write(script) e leggere con proc.stdout.read() perché communicate() chiuderà i flussi di input e output.

+1

In Python 3 ciò non funzionerebbe, è necessario un parametro aggiuntivo universal_newlines = True sul popen. Vedi https://stackoverflow.com/a/45133926/1534775 – gbonetti

0

ho avuto la gente uscita ... Qui è seguente:

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] 
Problemi correlati