如何通过Python脚本向adb shell传递多条命令且不退出shell
解决Python执行adb shell后续命令失效的问题
我完全懂你遇到的困扰——手动敲命令时,adb shell进入设备终端后,后续的cd、export、脚本执行都能正常跑,但用Python脚本依次执行的话,adb shell会启动一个独立的会话,后面的命令其实是在本地终端跑,根本没进到设备的shell里,自然就失效了。下面给你几个实用的解决办法:
方法一:合并设备内命令为单条adb shell指令
把所有需要在设备shell里执行的命令用&&或者分号连接,一次性传给adb shell,这样所有命令都会在同一个设备shell会话里执行,环境变量的修改也能生效。
示例代码:
import subprocess # 先执行adb root获取权限 subprocess.run(["adb", "root"], check=True) # 把设备内的所有命令合并,用&&确保前一条成功才执行下一条(也可以用分号忽略错误继续) device_cmds = "cd /data/local/tmp && export PATH=/data/local/tmp:$PATH && export PATH=/data/local/tmp/testcases:$PATH && sh ./runltp -p -l 1213reportipc.log -d /data/local/tmp/LTP13/tmp -f ipc1q" # 执行合并后的shell命令 subprocess.run(["adb", "shell", device_cmds], check=True)
方法二:维持adb shell会话并通过stdin传命令
用subprocess.Popen启动一个持续的adb shell会话,然后把所有命令通过标准输入(stdin)发送过去,模拟手动输入的过程,这样所有命令都在同一个会话里执行。
示例代码:
import subprocess # 先获取root权限 subprocess.run(["adb", "root"], check=True) # 启动adb shell会话,保持管道打开 adb_session = subprocess.Popen( ["adb", "shell"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) # 准备要执行的命令,每个命令后面必须加换行符(模拟回车) commands = [ "cd /data/local/tmp\n", "export PATH=/data/local/tmp:$PATH\n", "export PATH=/data/local/tmp/testcases:$PATH\n", "sh ./runltp -p -l 1213reportipc.log -d /data/local/tmp/LTP13/tmp -f ipc1q\n", "exit\n" # 最后退出会话 ] # 发送命令到会话的stdin adb_session.stdin.writelines(commands) adb_session.stdin.flush() # 获取执行结果 stdout, stderr = adb_session.communicate() # 可以打印结果排查问题 print("执行输出:", stdout) print("错误信息:", stderr)
方法三:用shell脚本文件批量执行(推荐复杂场景)
把所有设备内的命令写成一个shell脚本,推送到设备上再执行,这种方式最稳定,尤其是命令较多或者需要重复执行的场景。
示例代码:
import subprocess import os # 1. 本地创建shell脚本文件 script_content = """#!/bin/sh cd /data/local/tmp export PATH=/data/local/tmp:$PATH export PATH=/data/local/tmp/testcases:$PATH sh ./runltp -p -l 1213reportipc.log -d /data/local/tmp/LTP13/tmp -f ipc1q """ with open("run_ltp_script.sh", "w") as f: f.write(script_content) # 2. 获取root权限 subprocess.run(["adb", "root"], check=True) # 3. 把脚本推送到设备的临时目录 subprocess.run(["adb", "push", "run_ltp_script.sh", "/data/local/tmp/"], check=True) # 4. 给脚本添加执行权限 subprocess.run(["adb", "shell", "chmod", "+x", "/data/local/tmp/run_ltp_script.sh"], check=True) # 5. 执行脚本 subprocess.run(["adb", "shell", "/data/local/tmp/run_ltp_script.sh"], check=True) # 可选:清理本地和设备上的脚本文件 subprocess.run(["adb", "shell", "rm", "/data/local/tmp/run_ltp_script.sh"], check=True) os.remove("run_ltp_script.sh")
总结
- 如果命令不多,方法一最简洁直接;
- 如果需要实时交互或者查看中间输出,方法二适合;
- 命令复杂或者需要复用的话,方法三是最可靠的选择。
内容的提问来源于stack exchange,提问作者Ketan Bedekar
相关产品推荐
相关产品推荐

