MacOS下Python在终端播放声音并支持中途停止的实现问题
macOS Python 终端可控音频播放解决方案
你的问题本质是os.system调用属于同步阻塞逻辑,执行时会一直等待afplay播放完成才会执行后续代码,因此才会出现时序冲突的问题。
核心实现思路
- 用非阻塞的
subprocess.Popen替代os.system启动afplay进程,可随时主动终止播放 - 用独立后台线程监听用户输入,和播放逻辑完全分离互不阻塞
可直接运行的代码
import subprocess import sys import threading # 存储afplay播放进程实例 play_process = None def listen_stop_command(): global play_process user_input = input("输入 'halt' 可随时停止播放:\n") if user_input.strip() == "halt" and play_process is not None: # 直接终止播放进程 play_process.terminate() print("已停止播放") sys.exit(0) if __name__ == '__main__': # 替换为你实际的音频文件路径 audio_path = "/path/to/sound.mp3" # 启动后台线程监听用户输入,设置为守护线程跟随主进程退出 input_thread = threading.Thread(target=listen_stop_command, daemon=True) input_thread.start() # 启动播放进程,非阻塞启动 play_process = subprocess.Popen(["afplay", audio_path]) # 等待播放自然完成 play_process.wait() print("播放已完成")
特性说明
- 程序启动后立刻开始播放音频,同时会弹出输入提示,两个操作互不阻塞
- 任意时刻输入
halt回车都能立刻停止播放退出程序 - 音频路径带空格也能正常运行,不会出现
os.system拼接字符串的路径解析错误 - 音频正常播放完成后会自动退出,无需用户操作
内容的提问来源于stack exchange,提问作者user15986527
相关产品推荐
相关产品推荐

