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



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

我已经尝试了链接和其他一些链接中给出的所有方法,但它们都不起作用: 将变量从python传递到AppleScript中

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。因此,它应该开始播放 b.mp3而不停止 a.mp3并同时播放它们,直到 a.mp3 在文件结束时停止,然后在文件完成播放时停止 b.mp3。

首先,解决此问题的最佳方法是完全避免AppleScript,并直接从python运行"afplay"命令。如果您阅读了这两个堆栈溢出问题:

  • 如何分离由子进程调用的进程。
  • 并行运行子进程

您将看到您应该能够使用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)

假设当前路径(path0/path1)给出了正确的前缀,这应该有效;&> /dev/null &位告诉do shell script分离进程并立即返回。但这又是迂回的:你告诉python告诉一个shell告诉AppleScript告诉shell做某事,每一个额外的上下文变化都会为某些事情出错创造机会。

最新更新