如何在Python脚本中运行AppleScript?

8
如何在Python脚本中运行AppleScript?
问题已经说得很清楚了。 (在Mac上,显然)
4个回答

12

这篇不错的文章建议了一个简单的解决方法。

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

当然,今天你应该使用subprocess模块而不是os.system

确保还要检查文章的第2页,了解更多信息和选项,包括appscript


如果你要从Python进行任何非平凡的Apple事件脚本编写,你应该使用appscript。它设计良好、成熟且得到了良好的支持。 - Ned Deily
哦,Alex,我当然不是在反对 - Ned Deily
1
很遗憾,AppScript不再受支持。 - andrewb
3
你的意思是,“它不再得到支持”? - speedyrazor
@speedyrazor - 来自SourceForge上的appscript页面:“请注意,appscript不再得到开发或支持,并且不建议在新项目中使用。” http://appscript.sourceforge.net - jwpfox
显示剩余3条评论

6
一个新的subprocess版本,允许原样运行一个苹果脚本,而不必转义引号和其他可能会出现问题的字符。它是从这里找到的脚本的简化版本,该脚本还包括参数化和适当的转义(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://dev59.com/1HA85IYBdhLWcg3wF_m0#45133926。 - gbonetti

0

我得到了输出结果... 在这里:

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]

0

我对苹果自己的文档缺乏关于如何执行此操作并传递参数的详细信息感到非常沮丧。我不得不将所需的参数(在这种情况下是缩放ID)作为字符串发送,否则参数就无法传递到AppleScript应用程序中。

以下是我的Python代码运行:

f = script if os.path.exists(script) else _tempfile()

if not os.path.exists(script):
            open(f,'w').write(script)
args = ["osascript", f, str(zoom_id)]

kwargs = {'stdout':open(os.devnull, 'wb'),'stderr':open(os.devnull, 'wb')}
        #kwargs.update(params)
proc = subprocess.Popen(args,**kwargs)

这是我的AppleScript代码:

on run argv
    set zoom_id to 0
    zoom_id = item 1 in argv
    tell application "zoom.us"
       --do stuff
    end tell
end run

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接