如何从另一个Python脚本优雅停止音频录制脚本?
优雅停止Python音频录制脚本的方案
要触发finally:块完成资源清理,核心是让脚本主动结束执行流程,而非被强制终止。以下是几种实用方案:
方案1:捕获终止信号(推荐)
给录制脚本添加信号处理逻辑,捕获可终止信号(如SIGTERM/SIGINT),设置退出标志让主循环正常结束,从而触发finally块。
录制脚本修改示例:
import signal import time # 替换成你实际用的音频库 import sounddevice as sd running = True def handle_shutdown(signum, frame): global running running = False print("收到停止指令,准备结束录制...") # 注册信号处理器,捕获Ctrl+C(SIGINT)和常规终止信号(SIGTERM) signal.signal(signal.SIGINT, handle_shutdown) signal.signal(signal.SIGTERM, handle_shutdown) try: print("开始音频录制...") # 模拟持续录制的主循环,替换为你的实际录制逻辑 while running: # 示例:读取音频流(这里用sleep模拟) time.sleep(1) finally: print("执行资源清理:停止录制、释放音频设备...") # 实际操作:停止录音、关闭设备、保存文件等 sd.stop()
停止脚本的实现:
不要用pkill -f强制终止,而是找到进程ID发送SIGTERM信号:
import os import subprocess # 查找目标脚本的进程ID proc_output = subprocess.run( ["pgrep", "-f", "audio-recorder.py"], capture_output=True, text=True ).stdout.strip() for pid in proc_output.split("\n"): if pid: os.kill(int(pid), signal.SIGTERM)
或者直接用命令行:kill $(pgrep -f audio-recorder.py)
方案2:使用文件标记(跨平台友好)
录制脚本定期检查某个标记文件是否存在,若存在则主动退出循环,触发清理逻辑。
录制脚本修改示例:
import os import time import sounddevice as sd # 定义标记文件路径,可自定义 STOP_FLAG = "/tmp/stop_recording_flag" # 启动前清理旧标记 if os.path.exists(STOP_FLAG): os.remove(STOP_FLAG) try: print("开始音频录制...") # 主循环:检查标记文件,不存在则继续录制 while not os.path.exists(STOP_FLAG): # 替换为你的录制逻辑 time.sleep(1) finally: print("执行资源清理...") sd.stop() # 清理标记文件 if os.path.exists(STOP_FLAG): os.remove(STOP_FLAG)
停止脚本的实现:
只需创建标记文件即可:
import os STOP_FLAG = "/tmp/stop_recording_flag" # 创建空的标记文件 open(STOP_FLAG, "w").close()
方案3:进程间通信(复杂场景适用)
如果需要更灵活的控制(比如传递额外指令),可以让录制脚本监听本地Socket或管道,收到停止命令后主动退出。该方案需处理Socket连接逻辑,适合多进程协作场景。
内容的提问来源于stack exchange,提问作者Bob Gill
相关产品推荐
相关产品推荐

