使用Python代替AppleScript

时间:2015-01-21 02:19:37

标签: python macos applescript

我经常使用Applescript来完成打开和关闭程序等基本任务,有时会像运行特定Xcode程序的单元测试一样深入一些。我正在学习Python,我喜欢它。我还没有找到很多关于AppleScript与Python相关的文档。我的问题是:在Mac OS X上,可以使用Python代替AppleScript来完成上述任务吗?如果是这样,有没有人知道有关该主题的更多信息?

5 个答案:

答案 0 :(得分:3)

Python无法用于替换UI& AppleScript提供的自动化职责。但是,由于OS X 10.10(优胜美地)JavaScript也可以使用。

见这里:https://developer.apple.com/library/mac/releasenotes/InterapplicationCommunication/RN-JavaScriptForAutomation/index.html

答案 1 :(得分:3)

为了避免包括PyObjC在内的所有过时和所谓的“糟糕”模块,可以在脚本编辑器或脚本调试器(我的选择)中简单地调试脚本,然后通过Popen使用osascript执行它。我更喜欢这样,所以我可以确保应用程序实现的特性得到解决,并且Script Debugger具有出色的调试和浏览工具。

例如:

from subprocess import Popen, PIPE

def get_front_win_id():
    """
    Get window id of front Chrome browser window
    """
    script = '''
        on run {}
            set winID to 0
            tell application "Google Chrome"
                set winID to id of front window
                return winID
            end tell
        end run
    '''
    args = []
    p = Popen(['/usr/bin/osascript', '-'] + args,
              stdin=PIPE, stdout=PIPE, stderr=PIPE)
    stdout, stderr = p.communicate(script)
    winID = stdout.strip()
    return int(winID)

将列表中的args传递给osascript,但它们必须是字符串,因此复杂的数据结构对于编组和解组可能是单调乏味的,但是简单的代价是有代价的。为简单起见,我省略了错误检查和异常处理/提升。 TANSTAAFL

答案 2 :(得分:1)

无法真正替换它,但有一个可用的包装器:https://pypi.python.org/pypi/py-applescript/1.0.0 ...所以你可以在你的python程序中与它进行交互。

答案 3 :(得分:1)

使用Cocoa,您可以使用AESendMessage直接发送事件。虽然这是一项更多的工作。这是一个提供示例的要点:

https://gist.github.com/pudquick/9683c333e73a82379b8e377eb2e6fc41

答案 4 :(得分:1)

虽然您可以生成复杂的python,它调用与AppleScript相同的Apple事件,但在AppleScript中可以更轻松地处理某些事情。

在python中执行一些AS很容易:

from Foundation import NSAppleScript
textOfMyScript = """
   *(Your AppleScript Here)*
"""
myScript = NSAppleScript.initWithSource_(NSAppleScript.alloc(), textOfMyScript)
results, err = myScript.executeAndReturnError_(None)

如果您需要获取数据,结果是NSAppleEventDescriptor。