如何从Python脚本中运行AppleScript?
答
this nice article暗示简单的解决方案
cmd = """osascript -e 'tell app "Finder" to sleep'"""
def stupidtrick():
os.system(cmd)
虽然今天你使用subprocess
模块,而不是os.system
,当然。
答
A subprocess
版本允许原样运行原始Apple脚本,而不必转义引号和其他字符,这可能会非常棘手。它是脚本的简化版本,发现here也可以参数化和正确转义(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
注:如果您需要使用相同的POPEN实例执行多个脚本,那么你就需要使用
proc.stdin.write(script)
明确写入与读取proc.stdout.read()
因为communicate()
将关闭输入和输出流。
+1
在python 3中这是行不通的,需要在popen上增加一个参数universal_newlines = True。请参阅https://stackoverflow.com/a/45133926/1534775 – gbonetti 2017-07-16 22:48:35
答
我得到的输出乡亲......在这里它的下面:
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]
如果你打算做任何不平凡的苹果事件脚本从python,你应该使用appscript。它设计精良,成熟并且得到很好的支持。 – 2010-08-15 22:46:51
@Ned,当然,但为了这样一个简单,特殊的目的,就像调用简单的applescript,osascript -e和subprocess.call的“愚蠢的技巧”,正如文章的第1页我提到的文章使用旧的'os.system',但这是一个细节;-)可能就足够了。 – 2010-08-16 00:08:44
哦,亚历克斯,我当然不反对*你*! – 2010-08-16 00:51:32