我正在尝试使用嵌入式applescript中python文件中定义的变量。我希望将currentpath中的路径附加到在osascript语句中提到变量的位置。
我已经尝试了链接中提供的所有方法以及其他一些链接,但是它们都不起作用:Pass variable into AppleScript from python
import os
import sys
currentpath = os.path.dirname(sys.argv[0])
com = ("""osascript -e 'tell application "Terminal" to do script "afplay {0}/Sounds/storm-9s.mp3"'""".format(currentpath))
os.system(com)
所有的技巧都导致我遇到相同的错误,我不确定问题出在我的python代码还是applescript。
A94HDBSGHHHD:~ user$ afplay /Sounds/storm-9s.mp3
Unspecified exception
A94HDBSGHHHD:~ user$
更新:我的应用程序需要同时播放多个声音文件。使用子过程需要我的脚本对声音文件进行流水线处理,并仅在第一个文件完全播放后播放第二个文件。因此,我必须启动多个终端才能一起播放声音。 例如我的代码播放a.mp3,然后在完成播放之前,我的代码决定播放b.mp3。因此,它应该在不停止a.mp3的情况下开始播放b.mp3,并同时播放它们,直到文件结束时a.mp3停止,然后在文件播放完后b.mp3停止。
答案 0 :(得分:1)
首先,解决此问题的最佳方法是完全避免使用AppleScript,直接从python运行'afplay'命令。如果您阅读了以下两个Stack Overflow问题:
您会看到您应该能够使用popen
同时运行这些声音文件。
如果您真的想要AppleScript解决方案,那么我建议您不要编写终端脚本,而应使用do shell script
。这基本上与直接从AppleScript运行Shell命令相同,而没有Terminal.app的开销。看起来像这样:
com = """osascript -e 'do shell script "afplay {0}/Sounds/storm-9s.mp3 &> /dev/null &"'""".format(currentpath)
或者,如果您想冒险,可以将它们全部链接在一起,如下所示:
com = """osascript -e 'do shell script "afplay {0}/Sounds/storm-9s.mp3 &> /dev/null &"' -e 'do shell script "afplay {1}/Sounds/storm-9s.mp3 &> /dev/null &"'""".format(path0, path1)
假设currentpath(path0 / path1)给出了正确的前缀,则应该可以使用; &> /dev/null &
位告诉do shell script
分离进程并立即返回。但是,这又是circuit回曲折的:您要告诉python告诉shell告诉AppleScript告诉shell做某事,并且每次额外的上下文转换都会为出错的情况提供机会。