PYTHON rumps 程序在子进程调用另一个脚本后停止响应



>我目前正在处理一个在mac osx上包含许多系统托盘实用程序的项目,其中一个实用程序是"假朋友音板",我将在其中使用户能够单击模块,然后选择"Discord Ping x1"作为示例,程序播放ping的声音文件。

我使用RUMPS,它使我能够将菜单添加到系统托盘中,但是当尝试使用库直接播放声音时@rumps.clicked,似乎什么也没发生

相反,我已将其编程为运行另一个脚本,该脚本可以轻松地在包含所有声音的另一个文件夹中播放声音。

运行脚本并单击声音时,它会完全按预期播放声音,

但随后程序停止响应...

这是我的代码做错了,还是有另一种方法可以使用这个库播放声音?

这是代码:

import rumps
import subprocess
class sound(rumps.App):
def __init__(self):
super(sound, self).__init__("🔊")
self.menu = ["Fake friend soundboard",
None,
"Discord Sounds:",
"Ping x1",
"Incoming Call",
"Enter Call",
"Leave Call",
"Mute",
"Deafen",
None,
"Skype Sounds:",
"Incoming Call",
None,
"Random:",
"okbuddyretard",
None]
@rumps.clicked("Ping x1")
def about(sender):
subprocess.run("python3 soundboard/discord_pingx1.py", shell=True)
if __name__ == "__main__":
sound().run()

在音板文件夹中有声音文件夹,其中包含包含** discord_ping.wav 音板文件夹还保存下面的discordd_pingx1.py脚本。

import pyglet
def sound():
sound = pyglet.resource.media('sounds/discord/discord_ping.wav', streaming=False)
sound.play()
pyglet.app.run()
sound()

运行我的 main.py 后(打开所有模块( 并单击声音选项卡,然后单击按钮集以发出声音, 它播放,但随后停止响应。

任何帮助将不胜感激。

我强烈建议避免在执行Objective-C代码的Python脚本中插入subprocess或系统调用。这会导致中止和陷阱。相反,请参考Apple的API并使用AppleScript(osascript(。

下面是一个更好的实现,它调用脚本以从 osascript 调用脚本:

exec.py

import platform
import subprocess, sys, os
applescript = '''
do shell script "bash /path/to/file/myShellScript.sh"
'''
# parse and stdout
args = [item for x in [("-e",l.strip()) for l in applescript.split('n') if l.strip() != ''] for item in x]
proc = subprocess.Popen(["osascript"] + args ,stdout=subprocess.PIPE )
progname = proc.stdout.read().strip()
sys.stdout.write(str(progname))

解析器获取包含 osascript 的字符串,并将其解析为 stdout 写入。Stdout 写入非常安全,因为它们正在处理来自同一线程的数据。

/path/to/file/myShellScript.sh(在第 1 行也添加 shebang(

#!/bin/bash
python3 soundboard/discord_pingx1.py

这 100% 处理您的问题,而不会导致子流程错误。如果你被子进程挂起,你的电脑将继续运行Python3。如果应用程序未停止冻结,请通过cmd+Space并键入活动监视器退出应用程序。然后,通过cmd+f并键入python3找到Python3。单击它并按左上角的Quit(X 或红绿灯符号(。

最新更新