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

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

最佳答案

首先,解决这个问题的最佳方法是完全避免 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)

假设当前路径(path0/path1)给出了正确的前缀,这应该可以工作; &>/dev/null & 位告诉 do shell script 分离进程并立即返回。但这又是迂回的:你告诉 python 告诉 shell 告诉 AppleScript 告诉 shell 做某事,而每一次额外的上下文转换都会产生出错的机会。

关于python - 使用 applescript 使用 Python 文件中定义的路径变量更改目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57101312/

相关文章:

bash - 具有输入和管理权限的 Applescript 执行 Shell

python - Python 中索引的循环范围

python - SQLite 跨具有重复分组行的多列进行 SELECT 查询

applescript - 使用osascript -e "display notification"时更改通知图标

objective-c - Mac应用程序中的本地推送通知

macos - 应用程序未运行时播放推送通知音效 (Mac)

python - 将 Python 正则表达式转换为 Shell

python - 根据数字从列表中获取数据

c# - 我应该使用 Tkinter、C 还是 C# 在 Python 中制作 GUI?

linux - Mongorestore:createIndex 错误:v:2 索引键模式中的值不能是对象类型。只允许数字 > 0、数字 < 0 和字符串