添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

如何从 Python 脚本中运行 AppleScript?

7 人关注

如何从 Python 脚本中运行 AppleScript?

这些问题说明了一切。 (显然是在Mac上)

python
macos
applescript
GJ.
GJ.
发布于 2010-08-16
4 个回答
Alex Martelli
Alex Martelli
发布于 2020-06-03
已采纳
0 人赞同

这篇好文章 suggests the simple solution

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

虽然今天你会使用subprocess模块,而不是os.system,当然。

请务必同时检查第2页文章的更多信息和选项,包括脚本.

如果你要从Python中做任何一种非琐碎的苹果事件脚本,你应该使用appscript。它设计得很好,很成熟,而且有很好的支持。
@Ned,当然,但是对于调用一个简单的applecript这样一个简单的特定目的来说, osascript -e subprocess.call 的 "愚蠢技巧"。的 "笨招",正如文章第一页所建议的那样(我提到的文章使用了旧的 os.system ,但这是一个细节。-)可能就足够了。
哦,亚历克斯,我当然不是不同意 you !
不幸的是,appscript不再被支持了
你说 "不再支持 "是什么意思?
ccpizza
ccpizza
发布于 2020-06-03
0 人赞同

一个 subprocess 的版本,它允许按原样运行一个原始的苹果脚本,而不必转义引号和其他可能很麻烦的字符。它是一个简化的脚本版本,可以发现 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()会关闭输入和输出流。

在Python 3中,这将不起作用,需要在popen上增加一个参数universal_newlines=True。参见 stackoverflow.com/a/45133926/1534775
rajeshkumar
rajeshkumar
发布于 2020-06-03
0 人赞同

I got the Output folks... Here it's following:

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]
    
user3325025
user3325025
发布于 2020-06-03
0 人赞同

我对苹果自己的文档中没有详细说明如何做到这一点以及如何传递参数感到非常沮丧。我必须把所需的参数(在这种情况下是一个缩放ID)作为一个字符串发送,否则参数就不能传到applescript app中。

Here's my code running from 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