Python中执行ADB命令应使用subprocess模块,参数以列表形式传入、禁用shell=True、检查returncode或启用check=True、用Popen实现持续交互。

在Python脚本中执行ADB命令,核心是调用系统命令行工具,常用方式是 subprocess 模块,它比已弃用的 os.system 更安全、可控,能捕获输出、处理错误、传参灵活。
使用 subprocess.run 执行简单ADB命令
适合一次性命令,如查看设备、安装APK、截图等。推荐设置 shell=False(默认),避免shell注入风险;若需管道或重定向,再设为 True。
- 检查设备连接:subprocess.run(["adb", "devices"], capture_output=True, text=True)
- 安装APK:subprocess.run(["adb", "install", "app.apk"])
- 获取设备型号:result = subprocess.run(["adb", "shell", "getprop", "ro.product.model"], capture_output=True, text=True); print(result.stdout.strip())
处理ADB命令的返回值与错误
ADB执行失败时通常返回非0退出码,但不会自动抛异常。建议显式检查 returncode,或使用 check=True 让失败时触发 subprocess.CalledProcessError。
- 捕获并判断结果:result = subprocess.run([...]); if result.returncode != 0: print("ADB命令失败:", result.stderr)
- 自动报错(简洁写法):subprocess.run(["adb", "reboot"], check=True)
- 超时控制防卡死:subprocess.run(["adb", "shell", "ping -c 3 8.8.8.8"], timeout=10)
向ADB命令传递动态参数(如包名、文件路径)
避免字符串拼接(易出错且不安全),应将参数作为列表元素传入。路径含空格也不需额外处理,subprocess会自动转义。
这本书给出了一份关于python这门优美语言的精要的参考。作者通过一个完整而清晰的入门指引将你带入python的乐园,随后在语法、类型和对象、运算符与表达式、控制流函数与函数编程、类及面向对象编程、模块和包、输入输出、执行环境等多方面给出了详尽的讲解。如果你想加入 python的世界,David M beazley的这本书可不要错过哦。 (封面是最新英文版的,中文版貌似只译到第二版)
立即学习“Python免费学习笔记(深入)”;
- 启动指定Activity:pkg = "com.example.app"; activity = ".MainActivity"; subprocess.run(["adb", "shell", "am", "start", "-n", f"{pkg}/{activity}"])
- 推送文件到设备:local_path = "/path/with spaces/file.txt"; remote_path = "/sdcard/file.txt"; subprocess.run(["adb", "push", local_path, remote_path])
- 注意:不要写成 f"adb shell am start -n {pkg}/{activity}" —— 这属于shell模式,有安全隐患且跨平台兼容差
进阶:持续交互式ADB会话(如logcat监听)
用 subprocess.Popen 启动长期进程,实时读取stdout流,适合抓日志、监听广播等场景。
- 实时打印logcat:proc = subprocess.Popen(["adb", "logcat", "-v", "time"], stdout=subprocess.PIPE, text=True); for line in proc.stdout: print(line.strip())
- 终止进程:proc.terminate() 或 proc.kill()
- 注意:确保编码一致(Android logcat默认UTF-8),Windows下可能需加 encoding="utf-8"
基本上就这些。只要记住用 subprocess、参数拆成列表、检查返回值、避免 shell=True 乱拼字符串,ADB 调用就能既稳定又安全。









