背景介绍:
一直在负责公司Android自动化的编写工作,采用的是uiautomator2,需要获取设备id来连接设备,就是 adb devices
问题描述:
之前一直用 subprocess.check_output([‘adb‘,‘devices‘]) 来获取返回值,再用正则匹配id出来,但突然有一天 ubprocess.check_output([‘adb‘,‘devices‘]) 的返回值变成了空。
而在cmd运行 adb devices 却是正常的,而且 subprocess.check_output([‘adb‘,‘help‘])等命令执行又是正常的,只有执行获取设备信息方面的命令拿不到返回值
问题分析:
这让我很是头大,第一次遇到这个问题,我先后尝试过重装python、adb、AndroidSDK,但都没有用,请教过很多人也都说没遇到过,后来又去testhom 和 Stack Overflow去发帖求助,也没找到答案
我试着去查看python 的subprocess.py 的源码,大概情况是这样子:
(testhome的发帖记录:https://testerhome.com/topics/27741)
subprocess.check_output() 里面调用的是 一个run() 方法
def check_output(*popenargs, timeout=None, **kwargs): #省略~~~~~~ return run(*popenargs, stdout=PIPE, timeout=timeout, check=True, **kwargs).stdout
而run()方法最终调用的是 Popen()
def run(*popenargs, input=None, capture_output=False, timeout=None, check=False, **kwargs): ....... ........ with Popen(*popenargs, **kwargs) as process: try: stdout, stderr = process.communicate(input, timeout=timeout) except TimeoutExpired as exc: process.kill()
在debug过程中发现在 popen这一步就已经失败了,随后又进入Popen()查看,发现最终是 死在了 Start the process 这里(subprocess 模块,1200行那块)
看情况是创建process时失败了,随后猜想可能是被系统拦截了,或者没有权限~~
最终结果:
我找到adb.exe 给它加上了所有的权限,运行仍就失败~不起作用
后来看到里面有个兼容性的选项,我试着打了√再去运行,~~神奇的事情发生了,竟然就可以了emmmmm
总结:
至今出现这个问题的原因仍就没搞明白,不知道为什么会出现这个问题,由于能力有限,再往深也查不下去了;但这里肯定是有问题的,因为最初搭建环境的时候adb并没有勾选
兼容模式,执行subprocess.check_output()是可以获取到结果的,但后面突然就拿不到了~~如果有大神知道原因的话可以一起交流一下,我也很想弄明白这到底是什么问题