最近在用python做一个小工具,自动执行一些adb shell命令,使用subprocess.Popen来实现。

不过遇到个问题就是执行adb shell后就无法执行后面adb shell里的命令了,查询得知subprocess.Popen可以自定义stdin参数来源,比如可以使用上一个命令的stdout来做为下一个命令的stdin

p1 = subprocess.Popen('adb shell',  shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p2 = subprocess.Popen('ls', shell=True, stdin=p1.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print p2.stdout.read()

但在这里并未执行成功,怀疑原因是用subprocess执行adb shell,是在CMD环境下执行,而后面执行ls命令,就已经进入adb shell环境了

当然,我们可以直接在CMD中输入adb shell ls来达到目的,但一些adb shell自有命令如ll、grep在CMD中就无法识别

找到两个解决办法:
一、

  1. 把命令先保存在一个txt文档,如在D盘建一个a.txt,里面保存命令
    cat /data/system/packages.xml | grep -E "a|b|c|d"

  2. 用输入重定向的方法在CMD输入:adb shell < a.txt
    可以看到命令已经在CMD中执行了,但是会卡死,此时任何输入有效,但不显示,需要CTRL+C后才会显示出来

  3. 也可以将第2步做成BAT自动执行,建立一个run.bat,输入
    adb shell < d:\a.txt
    保存后直接执行run.bat就可以了

二、
上个方法虽然可行,但太过麻烦,而且需要第3方的文件来周转,之后在一个网友的帮助下,得到解决办法:
1.依然用python的subprocess.Popen实现

p1 = subprocess.Popen('adb shell cd sdcard&&cd Android&&cd data&&ls |grep com', stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print p1.stdout.read()

同时执行多行命令:
无论是 Linux/Mac 还是 Windows 的 shell 命令都支持一条命令来执行多条命令的。一共有&&&||| 这么几种方式,这几种方式分别代表着不同的含义:

&&:command1 && command2,如果 command1 执行成功了,就执行命令 command2,如果 command1 失败了,就不会执行 command2 了。

&:command1 & command2,无论 command1 执行成功与否都会执行 command2。

||:command1 || command2,如果 command1 执行成功了,就不会执行 command2 了,如果 command1 失败了,就会继续执行 command2。

|:command1 | command2,command1 的结果做为 command2 的参数,如果 command1 失败了,整个命令也就都失败了。

Linux/Mac 下还可以使用;来链接两条命令,顺序执行命令,不管成功与否都往后执行,和&含义一样。

python调用adb shell的更多相关文章

  1. 【python】python调用adb

    本期分享下python如何调用adb: 1.导入os模块 import os 2.python中调用adb命令语法 print("显示机型信息:") os.system('adb ...

  2. appium+python自动化-adb shell模拟点击事件(input tap)

    前言 appium有时候定位一个元素很难定位到,或者说明明定位到这个元素了,却无法点击,这个时候该怎么办呢? 求助大神是没用的,点击不了就是点击不了,appium不是万能的,这个时候应该转换思路,换其 ...

  3. python调用系统命令 shell命令

    使用python调用系统命令,基本有3种选择: 1. 使用os模块的system方法 import os os.system('ls') 2. 使用os模块的popen方法 import os os. ...

  4. appium+python自动化 adb shell按键操作

    前言 接着上篇介绍input里面的按键操作keyevent事件,发送手机上常用的一些按键操作 keyevent 1.keyevent事件有一张对应的表,可以直接发送对应的数字,也可以方式字符串,如下两 ...

  5. appium+python自动化-adb shell按键操作(input keyevent)

    前言 接着上篇介绍input里面的按键操作keyevent事件,发送手机上常用的一些按键操作 keyevent 1.keyevent事件有一张对应的表,可以直接发送对应的数字,也可以方式字符串,如下两 ...

  6. python进入adb shell交互模式

    import subprocess #方法一:进入某个环境执行语句(adb shell),注意shell内部命令需要带\n,执行完后一定记得执行exit命令退出,否则会阻塞 obj = subproc ...

  7. 举例讲解Linux系统下Python调用系统Shell的方法

    有时候难免需要直接调用Shell命令来完成一些比较简单的操作,比如mount一个文件系统之类的.那么我们使用Python如何调用Linux的Shell命令?下面来介绍几种常用的方法:1. os 模块 ...

  8. python 调用Linux shell

    有时候难免需要直接调用Shell命令来完成一些比较简单的操作,比如mount一个文件系统之类的.那么我们使用Python如何调用Linux的Shell命令?下面来介绍几种常用的方法: 1. os 模块 ...

  9. python调用adb命令进行手机操作

    Python中执行cmd命令可以用到os和subprocess两个模块. 区别在于os是阻塞式的,subprocess是非阻塞式的,所以一般我们使用subprocess是比较适合的. 接下来我先举一个 ...

  10. python中执行shell的两种方法总结

    这篇文章主要介绍了python中执行shell的两种方法,有两种方法可以在Python中执行SHELL程序,方法一是使用Python的commands包,方法二则是使用subprocess包,这两个包 ...

随机推荐

  1. 【ADB命令】安装app

    在电脑上安装以下指令 adb install app的文件位置

  2. openwrt从gitee pull代码并编译go项目

    安装ssh opkg update # openssh-keygen 可以用来生产密钥 opkg install openssh-keygen # 连接其他服务器 opkg install opens ...

  3. Linux 查看enable自启动服务

    pi@pi4:~/client $ systemctl list-unit-files |grep enable autovt@.service enabled avahi-daemon.servic ...

  4. react 学习笔记更新2.0

    1.性能优化 1.shouldComponentUpdate 在render调用之前会调用shouldComponentUpdate,不建议在 shouldComponentUpdate() 中进行深 ...

  5. 052_Lightning

    不支持内容: JavaScript buttons, customizable forecasting, and customizable tabs. 设置部分User选择使用Lightning: 单 ...

  6. 【BOOK】解析库--pyquery

    CSS选择器 1.初始化 html=''' <div> <ul> <li class="item-0">first item</li> ...

  7. 程序禁止在 VMware 虚拟机中运行的解决办法

    本帖最后由 ibq00 于 2018-12-22 18:54 编辑虚拟机里面不能开游戏!提示这个对话框!Sorry, this application cannot run under a Virtu ...

  8. python播放音频文件

    可在nano或者gax上面使用(已测试过) 将mp3文件转换为wav文件 trans_mp3_to_wav.py from pydub import AudioSegment # 这里filepath ...

  9. 【已解决】xlwings库合并单元格,不报错,不执行

    源代码如下: import xlwings as xw app = xw.App(visible=True, add_book=False) app.display_alerts = False ap ...

  10. element NavMenu侧栏导航菜单(可折叠)

    展示效果如图: 代码: <el-scrollbar class="scrollbar-wrapper"> <!-- el-scrollbar超长可滚动 --> ...