2010-08-15 25 views

Respuesta

11

this nice article sugiere la solución simple

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

pesar de que hoy tendrá que utilizar el módulo subprocess en lugar de os.system, por supuesto.

Asegúrese también de marcar page 2 del artículo para obtener más información y opciones, incluyendo appscript.

+0

Si va a hacer ningún tipo de secuencias de comandos no trivial de Apple Evento de Python, usted debe utilizar appscript. Está bien diseñado, es maduro y está bien respaldado. –

+0

@Ned, claro, pero para un propósito tan simple y específico como llamar a un simple trozo de applescript, el "truco estúpido" de 'osascript -e' y' subprocess.call', como se sugiere en la página 1 del artículo (bueno, El artículo que menciono usa el antiguo 'os.system', pero eso es un detalle ;-) podría ser suficiente. –

+0

¡Oh, Alex, ciertamente no estaba en desacuerdo con * usted *! –

5

A subprocess versión que permite ejecutar un script original de Apple tal cual, sin tener que escapar de comillas y otros caracteres que pueden ser complicados. Es una versión simplificada del script encontrado here que también hace la parametrización y el escape adecuado (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: Si es necesario ejecutar más de una secuencia de comandos con la misma instancia Popen entonces tendrá que escribir de forma explícita con proc.stdin.write(script) y leer con proc.stdout.read() porque communicate() cerrará las corrientes de entrada y salida.

+1

En python 3 esto no funcionaría, se necesita un parámetro adicional universal_newlines = True en el popen. Ver https://stackoverflow.com/a/45133926/1534775 – gbonetti

0

que tiene la gente de salida ... Aquí está lo siguiente:

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] 
Cuestiones relacionadas