使用Python+ADB录制Android屏幕时进程阻塞问题求助
问题分析与修复方案
你的代码核心问题有两个:
record()函数里调用了provaprocesso.communicate(),这个方法会阻塞直到子进程结束,导致程序卡在录制启动步骤,后面的time.sleep(3)和stoprecord()完全没机会执行。stoprecord()里用["^C"]发送中断信号的方式无效,^C是终端键盘输入信号,无法通过subprocess直接发送。
还有两个细节漏洞:
- 命令字符串拼接时缺少空格,
"shell" + "screenrecord"会变成shellscreenrecord(你说录制已启动,可能实际代码有空格,但建议用列表传参彻底避免这类错误)。 comando变量未定义,需要预先赋值为你的Android设备序列号(可通过adb devices查看)。
修复后的完整代码
import subprocess import time import signal # 替换成你的设备序列号(adb devices命令可查) comando = "your_device_serial" # 全局变量保存录制进程对象,供stoprecord调用 record_process = None def record(): global record_process # 用列表形式传参,避免shell=True和字符串拼接错误 cmd = ["adb", "-s", str(comando), "shell", "screenrecord", "/sdcard/video.mp4"] # 启动进程但不等待结束,直接继续执行后续逻辑 record_process = subprocess.Popen(cmd) def stoprecord(): global record_process if record_process: # 发送SIGINT信号,模拟Ctrl+C中断录制 record_process.send_signal(signal.SIGINT) # 等待进程完全退出,避免拉取文件时未写入完成 record_process.wait() # 拉取视频到当前目录 subprocess.run(["adb", "-s", str(comando), "pull", "/sdcard/video.mp4"], check=True) # 删除设备端的视频文件 subprocess.run(["adb", "-s", str(comando), "shell", "rm", "/sdcard/video.mp4"], check=True) # 执行流程 record() time.sleep(3) stoprecord()
关键改进点
- 移除
communicate(),改用全局变量保存Popen进程对象,让程序能继续执行等待和停止逻辑。 - 用
send_signal(signal.SIGINT)代替无效的^C命令,正确中断adb屏幕录制进程。 - 改用列表形式传递命令参数,避免字符串拼接的空格问题,同时无需
shell=True,更安全。 - 增加
record_process.wait(),确保录制进程完全退出后再拉取文件,避免文件损坏。 - 加入
check=True,adb命令执行失败时会抛出异常,方便排查问题。
内容的提问来源于stack exchange,提问作者WhoamI
相关产品推荐
相关产品推荐

