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

Change directory using applescript using a path variable defined in Python file

我正在尝试在嵌入式 applescript 中使用 python 文件中定义的变量。我希望将 currentpath 中的路径附加到我在 osascript 语句中提到变量的位置。

我已经尝试了 link 和其他一些 link 中给出的所有方法,但其中 none 有效:

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 在文件播放完毕时停止。

首先,解决此问题的最佳方法是完全避免使用 AppleScript 和 运行 直接来自 python 的 'afplay' 命令。如果您阅读了这两个 Stack Overflow 问题:

  • How to detach a process called by subprocess.call
  • Running subprocesses in parallel

您会发现您应该能够同时使用 popen 到 运行 这些声音文件。

如果您真的想要 AppleScript 解决方案,那么我建议您忘记编写终端脚本并改用 do shell script。这与直接从 AppleScript 中 运行ning 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 分离进程并立即 return。但这又是迂回的:你告诉 python 告诉 shell 告诉 AppleScript 告诉 shell 做某事,而每一次额外的上下文转换都为某事创造了机会出错了。