使用applescript使用Python文件中定义的路径变量来更改目录

时间:2019-07-18 19:16:04

标签: python macos applescript osascript

我正在尝试使用嵌入式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停止。

1 个答案:

答案 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做某事,并且每次额外的上下文转换都会为出错的情况提供机会。