【问题标题】:Using Python in Place of AppleScript使用 Python 代替 AppleScript
【发布时间】:2018-02-12 01:47:21
【问题描述】:

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

【问题讨论】:

    标签: python macos applescript


    【解决方案1】:

    为了避免所有过时和所谓的“蹩脚”模块,包括 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,但它们必须是字符串,因此复杂的数据结构可能难以编组和解组,但简单性是有代价的。为了简单起见,我放弃了错误检查和异常处理/引发。坦斯塔夫

    【讨论】:

      【解决方案2】:

      Python 不能用于替代 AppleScript 提供的 UI 和自动化职责。但是,由于 OS X 10.10 (Yosemite) JavaScript 也可以使用。

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

      【讨论】:

      • 在 python 中使用 AE 模块将获得对 AppleScript 等应用程序的完全控制。所以是的,它可以完全取代 AppleScript,包括 UI 和自动化。语法在这里变得更像 JavaScript:docs.python.org/2/library/macosa.html
      • Python 2.x 中的 AE 模块已经残废、蹩脚并且长期损坏。不要在它们上浪费时间(Python 3 完全抛弃了它们)。 Python-appscript 桥与 AppleScript 本身一样好 99%,但实际上是由 Apple 的碳战争遗留下来的,我不再为它提供支持。 OS X 的 Scripting Bridge 框架可以通过 PyObjC 访问,但它也很残缺。它可能适用于琐碎的任务,但适用于 AppleScript 的任何不平凡的事情。哦,用于自动化的 JavaScript 也很残缺,而且它的通用库支持与 Python 相比微不足道。
      【解决方案3】:

      虽然您可以生成复杂的 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。

      【讨论】:

      • 这似乎需要 pyobjc 库
      • @JerryT PyObjC 包含在 MacOS 中。旧版本,但上面的脚本应该可以工作。可以下载更新版本的 PyObjc。
      【解决方案4】:

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

      【讨论】:

      • 另一个更巧妙的选择是使用 PyObjC 和 AppleScriptObjC 桥,允许 Python 直接调用 AppleScript 处理程序。它并不完美(例如,日期和文件对象不会自动桥接,因此您需要稍微调整一下),但它可以与 Apple 提供的 Python 开箱即用;无需安装额外的库。请参阅 appscript.sourceforge.net/asoc.html 了解快速操作方法。
      【解决方案5】:

      使用 Cocoa,您可以使用 AESendMessage 直接发送事件。不过,这还有很多工作要做。这是一个提供示例的要点:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-07
        • 1970-01-01
        • 1970-01-01
        • 2019-09-17
        • 1970-01-01
        • 2012-04-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多