我也在寻找一个好的 python 模块来在 python 中使用“applescript”。事实上,我就是这样来到这里的。我找不到任何东西,所以我不得不想出自己的解决方案。
最适合我的是使用 subprocess 模块从我的 python 程序中调用 osascript。
更准确地说,(请参阅下面的代码以获取示例),如果我想在我的日历中添加一些内容,我会在我的 python 程序中生成将其作为字符串执行的 applescript,然后将其通过管道传输到 osascript。
这不是超级优雅,也可能不是超级快,但效果很好。因此,我目前正在编写一个日历模块,该模块具有用于添加事件、获取事件列表的 python 函数......并且每个都将 applescript 生成为字符串并调用 osascript。
这听起来很糟糕,但效果很好,一旦你有一个你最喜欢的程序的模块,你就不需要再担心 applescript。
需要一种方法在 applescript 中对返回数据进行编码,然后在 python 程序中对其进行解码。对我来说,传入和传出 applescript 的大多数数据都是类似字典的,到目前为止,使用 re 模块这还不是问题。
这是获取日历“生日”的 uid 的示例。
我的方法的主要问题是我需要为我想在 applescript 中访问的所有内容编写包装函数。一个令人厌烦的过程。
我看到的主要优势是 a) 它有效,我可以到达我想要的地方,b) 它似乎是未来的证明。因为,如果苹果在某个时候放弃了 applescript 以支持 javascript 或其他什么,那么一旦我调整了包装模块,我的所有程序仍然可以工作。
不管怎样……
希望对您有所帮助。
顺便说一句,如果有人知道更好的方法,请告诉我。或者如果有人不知道更好的方法但喜欢我的方法并且有兴趣帮助编写包装模块,也请告诉我。
这是一个例子。
最好,
斯蒂芬
import subprocess
def asrun(ascript):
"Run the AppleScript ascript and return the standard output and error."
return subprocess.run(['osascript'],
input=ascript,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
encoding="utf-8")
def get_uid_of_calendar(name):
script = '''\
tell application "Calendar"
return uid of calendar "'''+name+'''"
end tell
'''
cal_res = asrun(script)
return cal_res.stdout
get_uid_of_calendar("Birthdays")