【问题标题】:How do I communicate between python and a mac application?如何在 python 和 mac 应用程序之间进行通信?
【发布时间】:2012-07-08 16:08:40
【问题描述】:

这可能是一个模糊的问题,但我没有正确地改写它。所以这里有一个解释。

我开发了一个应用程序,该应用程序最初是作为 Mac 应用程序开发的,使用来自 Carbon/Cocoa 的 API 来完成我的任务。 (应用程序的目标是在鼠标移动/其他击键后向应用程序发送“击键”。我为此使用 Accessibility API)。

但是现在,我想添加脚本支持,所以可以有条件击键。如:按'Y'5次后,我想按'B'键。

在 OSX 中,Python 应用程序不可能做这样的事情,而且我找不到任何允许我这样做的库。所以我想我会把这个应用程序做成两倍。首先:我将在 Cocoa/Carbon 中编写一个具有基本功能的应用程序:SendKeyToApp(pid,key) 和 WaitForMovement()。

python 应用程序将使用这些方法调用与该应用程序进行通信。这里的问题是:我如何在这两个应用程序之间进行通信?我会使用 HTTP 服务器、套接字服务器、某种 subprocess.Popen() hacks。坦率地说,我不知道。

有没有人有任何想法来完成这样的任务?

【问题讨论】:

    标签: python macos communicate


    【解决方案1】:

    上,许多原生应用程序支持 AppleScript(又名 OSA)作为它们的原生脚本 API。因此,您的问题变成了 Python 和 Applescript 之间的交互问题(首先要弄清楚如何在 AppleScript 中与您的目标应用程序对话)。

    some OSA support in the Python standard library 和一个第三方模块py-applescript 你可能想看看。

    【讨论】:

      【解决方案2】:

      更容易。我从 Python 中使用了 Accessibility API,这一切都让我可以轻松地做到这一点,而无需任何 Cocoa / Carbon。

      有兴趣的可以叫atomac.

      【讨论】:

        【解决方案3】:

        PyObjC 可能就是您要找的:

        PyObjC(发音为 pie-obz-see)是使在 Python 中编写 Cocoa 应用程序成为可能的关键部分。它使 Python 对象能够向 Objective-C 对象发送消息,就好像它们是 Python 对象一样,并且同样有助于 Objective-C 对象向 Python 对象发送消息。

        您可以使用 PyObjC 在您的 python 应用和可可应用之间建立一座桥梁。

        【讨论】:

          【解决方案4】:

          在我看来,在两个应用程序之间建立通信的最简单方法是客户端-服务器协议 XMLRPCCocoaPython 都支持它。

          Python 部分相当简单:

          import xmlrpc.client
          rpcProxy = xmlrpc.client.ServerProxy(URL_OF_SERVER)
          rpcProxy.SendKeyToApp(pid,key)
          

          至于 Cocoa 部分,我不知道,但似乎可以:XML-RPC Server in CocoaBest way to use XML-RPC in Cocoa application?

          【讨论】:

          • 看起来 Cocoa 在服务 XMLRPC 方面做得并不好,但客户端支持似乎很广泛。我该怎么做?我需要 Python 向 Cocoa 服务器发送一些东西,而不是相反。 (Python 发明了“命令”,Cocoa 执行它们)。
          【解决方案5】:

          有很多方法可以在两个应用程序之间同步/通信数据,但让我解释一下最简单的:

          RESTful 序列化:
          将对象序列化为 XML/JSON 或任何其他应用程序框架都可以解析的自定义格式。例如。 http://docs.python.org/library/json.html
          如果两个应用程序都在同一台服务器/机器上,我希望您所要做的就是将数据编码/存储到同一个文件中,并从其他应用程序中的各个文件中读取/解析数据。

          否则您可能需要创建一个 Web 服务来访问数据文件。

          如果您有其他疑问,请在 cmets 中告诉我。

          【讨论】:

          • 我需要它是“即时的”。看起来文件 I/O 太慢了?我需要在 100 毫秒内解决问题,这样它才能足够高效。
          • 使用 HTTP GET/POST 请求,该请求将通过本地计算机或远程计算机上的网络连接。在本地机器上,你可以说 1 毫秒或更短的时间,在私有本地网络上远程可能不超过 30 毫秒
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-16
          • 2011-07-29
          相关资源
          最近更新 更多