2015-01-21 84 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,如果你需要得到的數據出來。