问答 python 调用 adb 设备命令返回值为空,求大神们帮忙分析一下

anshendoufunao · 2021年01月25日 · 最后由 jiyvn 回复于 2021年03月04日 · 5382 次阅读

问题描述:
adb devices 获取设备信息正常,但 python 调 cmd 就拿不到返回值
如图:adb 查看正常

python 调用返回空

调用 help 等命令有返回值,目前看就 设备相关信息返回为空

自己 debug 到这里就已经是空了,再往下看不下去了,有没有人遇到过同样的问题

(之前一直是 OK 的,不知怎么突然就没返回值了,os.popen 等命令也同样问题)
adb,python 卸载重装都不管用,,只差重装系统了

共收到 37 条回复 时间 点赞

加个 shell=True 试试

咸鱼菜鸡 回复

不管用,还是空的

readDeviceId = list(os.popen('adb devices').readlines())
试试这样呢

Kori 回复

这样拿到的是一个空列表

我这执行 adb 其他命令都正常,但就获取设备信息类的命令,全部拿不到返回值,os.ponen 啥的命令也是一样的情况,,查了两天了也没定位到原因

哦对了,执行 version 也不行
list(os.popen('adb --version').readlines())
[]

重启一下电脑吧。

重启 adb, adb kill-server 再 adb start-server

Kori 回复

没用,重启过 N 次了,adb 和 python 我都重装过好几次了,都不行

蓝蓝 回复

试过了,还是一样

process = subprocess.Popen("adb devices", shell=True, stdin=subprocess.DEVNULL,
                                       stdout=subprocess.PIPE,
                                       stderr=subprocess.PIPE)
            output = process.stdout.readlines()
            err = process.stderr.readlines()

这样看看行不行哇

蓝蓝 回复

我刚找 it 格式化了 c 盘重装系统都不行~~~,,真屌了

换个手机也不行吗

Kori 回复

不行

设 stderr=subprocess.STDOUT

rst=os.popen('adb devices').read()
devices=re.findall(r'(.*?)\s+device', rst)

不起作用,它并没有报错,只是返回内容是空的

Null 回复

一样,不管用

关掉杀软

你 python 调用的 adb 和你本地使用的 adb 是同一个吗

咸鱼菜鸡 回复

是一个,我电脑只有这一个 adb,调 adb 其它操作都正常,唯独 调设备信息类的都没有返回值

anshendoufunao 回复

adb shell 以及其他的操作呢

咸鱼菜鸡 回复

操作执行命令都可以执行,只是没有返回值,搞得我头都大了

subprocess.check_output("adb devices", shell=True) 试试

咸鱼菜鸡 回复


不行,现在就是 python 调 adb 获取返回内容不行,执行命令可执行,很诡异

换个电脑试试吧。。


不用谢

Python 和 adb 环境变量怎么配的?

Benjamin 回复

一样的,同样是拿不到,早就试过了

anshendoufunao 回复

除了 adb devices 外,adb --version 同样也拿不到返回值,但执行 adb --help 却能拿到


我用的 popen 没毛病

换个 adb 版本试试

初步判断是你的 adb 没有加到环境变量,或者你把 adb 放在你工程目录下。以下是我测试的结果,本机没装 adb。

os.popen('adb devices').readlines()
[]

import subprocess
temp = subprocess.check_output("adb devices",stderr=subprocess.STDOUT,shell=True)
print(temp)

b'List of devices attached \r\nHJWV1BRDBM\tdevice\r\n\r\n'


如图所示即可

HSB2 回复

不是环境变量的问题,已经解决了,但原因还不知道是为什么~~

此贴终结:
这个问题困扰了我好久,也翻墙到了 stackoverflow 去发帖求助仍没找到答案
今天又重新研究了一下这个问题,
大概情况是这样
执行 subprocess.check_output(['adb', 'devices']) 时,里面最后调的是 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 下去,发现是在 Start the process 时就直接失败了,最终死在了这里

class Popen(object):
    。。。。
    。。。。
    。。。。
  # Start the process
    try:
         hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
                                 # no special security
                                 None, None,
                                 int(not close_fds),
                                 creationflags,
                                 env,
                                 os.fspath(cwd) if cwd is not None else None,
                                 startupinfo)
      finally:
          ........
          .........

随后我猜想可能是请求被 win 系统拦截了,或者是权限问题,随后我找到 adb,右键属性 - 先是 - 勾选'完全控制',加了所有的权限,再运行扔不起作用,
后来看到里面有个兼容性,我就是试着勾选上在运行~~神奇的事情发生了!!!竟然就可以了!

原因仍就没找到~~~,大神们有兴趣可以研究一下

anshendoufunao 关闭了讨论 03月01日 08:11
anshendoufunao 重新开启了讨论 03月01日 08:12

曾经遇到过偶尔没有输出的问题,用 ['cmd', '/c', '<command>'] 正常了

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册