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

如何从另一个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 13:26:10