我正在使用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
谢谢!
答案 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。