2010-08-15 209 views

回答

11

this nice article暗示簡單的解決方案

cmd = """osascript -e 'tell app "Finder" to sleep'""" 
def stupidtrick(): 
    os.system(cmd) 

雖然今天你使用subprocess模塊,而不是os.system,當然。

一定還要檢查page 2的文章瞭解更多的信息和選項,包括appscript

+0

如果你打算做任何不平凡的蘋果事件腳本從python,你應該使用appscript。它設計精良,成熟並且得到很好的支持。 – 2010-08-15 22:46:51

+0

@Ned,當然,但爲了這樣一個簡單,特殊的目的,就像調用簡單的applescript,osascript -e和subprocess.call的「愚蠢的技巧」,正如文章的第1頁我提到的文章使用舊的'os.system',但這是一個細節;-)可能就足夠了。 – 2010-08-16 00:08:44

+0

哦,亞歷克斯,我當然不反對*你*! – 2010-08-16 00:51:32

5

A subprocess版本允許原樣運行原始Apple腳本,而不必轉義引號和其他字符,這可能會非常棘手。它是腳本的簡化版本,發現here也可以參數化和正確轉義(Python 2.x)。

import subprocess 

script = '''tell application "System Events" 
    activate 
    display dialog "Hello Cocoa!" with title "Sample Cocoa Dialog" default button 2 
end tell 
''' 

proc = subprocess.Popen(['osascript', '-'], 
         stdin=subprocess.PIPE, 
         stdout=subprocess.PIPE) 
stdout_output = proc.communicate(script)[0] 
print stdout_output 

注:如果您需要使用相同的POPEN實例執行多個腳本,那麼你就需要使用proc.stdin.write(script)明確寫入與讀取proc.stdout.read()因爲communicate()將關閉輸入和輸出流。

+1

在python 3中這是行不通的,需要在popen上增加一個參數universal_newlines = True。請參閱https://stackoverflow.com/a/45133926/1534775 – gbonetti 2017-07-16 22:48:35

0

我得到的輸出鄉親......在這裏它的下面:

import subprocess 
import sys 

for i in range(int(sys.argv[1])): 
    ip = str(sys.argv[2]) 
    username = str(sys.argv[3]) 
    pwd = str(sys.argv[4]) 

    script = '''tell application "Terminal" 
     activate 
     do script with command "cd Desktop && python test_switch.py {ip} {username} {pwd}" 
     delay 15 
    end tell 
    ''' 

    proc = subprocess.Popen(['osascript', '-'], 
         stdin=subprocess.PIPE, 
         stdout=subprocess.PIPE) 
    stdout_output = proc.communicate(script.format(ip=ip, username=username, pwd=pwd))[0]