使用Applescripts通过Python打印到终端

时间:2016-08-28 20:37:26

标签: python terminal applescript

我正在使用python运行一些Applescript脚本。我希望能够在“重复”循环中打印到屏幕上。我目前正在做的一个愚蠢的例子是:

from subprocess import Popen, PIPE

##### My applescript script

scpt = '''                                                                                                                                            
set letters to {"A", "B", "C"}                                                                                                                        
repeat with theLetter in letters                                                                                                                      
     do shell script "echo " & theLetter                                                                                                              
end repeat                                                                                                                                            
'''

#### run the script
p = Popen(['osascript', '-'], stdin=PIPE, stdout=PIPE, stderr=PIPE)
stdout, stderr = p.communicate(scpt)
print stdout, stderr

现在,这样做只有最后一个条目被打印到终端(在本例中为“C”)。有没有办法让我在每次迭代时都能打印到终端。即。

A
B
C

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您不介意输出到stderr,那么以下是我使用的最简单方法:

from subprocess import Popen, PIPE

##### My applescript script

scpt = '''
set letters to {"A", "B", "C"}
repeat with theLetter in letters
     log theLetter
end repeat
'''

#### run the script
p = Popen(['osascript', '-'], stdin=PIPE, stdout=PIPE, stderr=PIPE)
stdout, stderr = p.communicate(scpt)
print stdout, stderr

这将为您提供以下内容(由于空标准输出,请注意前导空格):

 A
B
C

如果使用log,另一个选项就是组合stdout和stderr,所以最终得到:

from subprocess import Popen, PIPE, STDOUT

##### My applescript script

scpt = '''
set letters to {"A", "B", "C"}
repeat with theLetter in letters
     log theLetter
end repeat
'''

#### run the script
p = Popen(['osascript', '-'], stdin=PIPE, stdout=PIPE, stderr=STDOUT)
stdout, stderr = p.communicate(scpt)
print stdout

给你:

A
B
C

当然,由于这是使用communicate,它只会在流程完成时为您提供输出,如果您想在屏幕上显示进度,一种方法是根本不捕获stderr ,让Applescript打印到stderr(使用log),并在完成后将你的Python输出发送到stdout。