You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 14:06:03