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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:00:45