2015-01-21 137 views
1

我经常使用Applescript来完成打开和关闭程序等基本任务,有时候会像运行特定Xcode程序的单元测试一样深入一点。我正在学习Python,我喜欢它。我一直无法找到许多有关AppleScript与Python的文档。我的问题是:在Mac OS X上,Python可以用来代替AppleScript来完成上述任务吗?如果是这样,是否有人知道有更好的资源来了解更多关于该主题的内容?在AppleScript中使用Python

回答

3

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

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

+0

在python中使用AE模块将像AppleScript一样完全控制应用程序。所以是的,它可以完全取代AppleScript,包括UI和自动化。在这里,语法变得更像是JavaScript的更多内容:https://docs.python.org/2/library/macosa.html – 2015-01-21 22:26:22

+3

Python 2.x中的AE模块已经瘫痪,糟糕透顶并且破损不堪。不要浪费你的时间(Python 3完全抛弃它们)。 Python-appscript桥梁与AppleScript本身相比有99%的优势,但苹果的Carbon on War战略实际上是遗留下来的,我不再为它提供支持。 OS X的Scripting Bridge框架可以通过PyObjC访问,但它也很糟糕,也很糟糕;它可能适用于琐碎的任务,但对于任何不平凡的AppleScript脚本来说都是如此。噢,自动化的JavaScript功能已经瘫痪了,而且它的通用库支持与Python相比没有任何意义。 – foo 2015-01-22 09:26:27

1

不能真正取代它,但没有可用于它的包装:https://pypi.python.org/pypi/py-applescript/1.0.0 ...所以你可以用它在你的Python程序中进行交互。

+1

另一个更清晰的选项是使用PyObjC和AppleScriptObjC桥接,允许Python直接调用AppleScript处理程序。这并不完美(例如日期和文件对象不会自动桥接,因此您需要小心一些),但它可以与Apple提供的Python一起使用;不需要安装额外的库。请参阅http://appscript.sourceforge.net/asoc.html以获得快速的指导。 – foo 2015-01-22 09:35:00

1

使用Cocoa,您可以使用AESendMessage直接发送事件。尽管如此,还有很多工作要做。下面是它提供了一个例子的要点是:

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

避免一切过时和所谓的“蹩脚”模块,包括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) 

在列表通行证参数传递给osascript但它们必须是字符串,以便复杂的数据结构可以是乏味的编组和与解组但对于简单价格。为了简单起见,我停止了错误检查和异常处理/升级。 TANSTAAFL

0

虽然可以生成与AppleScript相同的Apple事件的复杂Python,但在AppleScript中可以更轻松地处理一些事情。

这是很容易执行一些AS在python虽然:

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

的结果是一个NSAppleEventDescriptor,如果你需要得到的数据出来。