背景介紹:
一直在負責公司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()是可以獲取到結果的,但后面突然就拿不到了~~如果有大神知道原因的話可以一起交流一下,我也很想弄明白這到底是什么問題
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/265278.html
標籤:Python
上一篇:ThinkPHP5權限管理
