python subprocess的Popen()和call()(adb)

最近要用到adb连接手机截图,在CMD上:
adb shell /system/bin/screencap -p /sdcard/screenshot.jpg #截图保存在手机上
adb pull /sdcard/screenshot.jpg d:/screenshot.jpg #将图片复制到电脑上

这两句话,整个百度都是,也没问题,然而,当我想用python实现这两句话的时候,却一直都不能成功,图片总是无法完整的复制到电脑上,百度上用到的方法,找来找去,就这几个:os.popen(),os.system(),subprocess.Popen().都不行。我当时按照百度的资料,形如下面这样测试:

import os

os.popen(" adb shell /system/bin/screencap -p /sdcard/screenshot.jpg ")
os.popen(" adb pull /sdcard/screenshot.jpg  d:/screenshot.jpg ")

上述三种方法我都试过,都不行,从现象来看,问题就在于,这些指令都没问题,都是执行了的,但是,他就是不能完整执行完就结束了,我也很纳闷,为什么会这样。

然后看到了什么阻塞不阻塞的,我想,阻塞的话,是不是就能执行完整了?查资料,资料不多,关键说的不清楚,还有错的,有说os.popen()阻塞,subprocess.Popen()非阻塞的,也有反过来说的。但是为什么两种方法我都测试了,都不行呀,到底谁是阻塞的呀。。

直到看到这篇文章,才找到解决办法, subprocess.Popen()想阻塞,还得加一个wait(),即subprocess.Popen().wait()。实际上这就是subprocess.call(),这个才是阻塞的,这样就可以完整执行了。为什么网上大多数资料都不需要用到这个函数就能够成功执行呢?难道是我用的python3.6功能不完善?

顺便吐槽一下,adb截图为什么效率这么低呀。。截图加复制差不多需要3秒钟(我的设备上,即使换别的时间也不会短很多吧?),有没有人能够教教我,对于效率问题,我总是耿耿于怀!

你可能感兴趣的:(python)