subprocess.check_output无法执行命令,但在Windows

时间:2017-03-19 20:49:58

标签: android python shell subprocess adb

我正在尝试将两个设备连接到我的电脑,并使用python和adb在它们上运行一些命令。 当我从命令提示符运行命令时,它会很好,但是当我把它们放在python脚本中时,它们会给我错误。 这会导致错误:

from subprocess import check_output, CalledProcessError
try:
    adb_ouput = check_output(["adb","devices","-l","|", "grep", "\"model\""])
    print adb_ouput
except CalledProcessError as e:
    print e

我得到的错误信息是:

Usage: adb devices [-l]
Command '['adb', 'devices', '-l', '|', 'grep', '"model"']' returned non-zero exit status 1

当我在没有grep命令的情况下尝试相同的代码时,它可以正常工作

adb_ouput = check_output(["adb","devices","-l"])

它给了我正确的输出。

当我在Windows命令提示符下尝试相同时,它工作正常(我用FINDSTR替换grep,因为我在windows中使用它,我也试过在python脚本中也这样做,'shell =真的'也没有。)

例如:

adb devices -l | FINDSTR "model"

这给了我一个没有任何问题的ouptut。 我得到的输出是

  

123ab6ef设备产品:xxxxxxxxx型号:xxxxxxxxx设备:xxxxxxxxx

     

bd00051a4设备产品:yyyyyyyyyyy型号:yyyyyyyyyyy设备:yyyyyyyyy

我试图了解我在哪里出错,但无法理解。 到目前为止,我已经检查了文档:https://docs.python.org/3/library/subprocess.html https://docs.python.org/3/library/subprocess.html#subprocess.CalledProcessError 这些只是给我错误代码。

我也看过这些答案: Python, adb and shell execution query 我从这里做了一些错误检查并添加到我的代码中。

Python subprocess.check_output(args) fails, while args executed via Windows command line work OK python check_output fails with exit status 1 but Popen works for same command

我认为我很接近,但我不能把手指放在上面。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

第一

adb_ouput = check_output(["adb","devices","-l","|", "grep", "\"model\""])

肯定需要shell=True,但即便如此,它也不等同于

adb devices -l | FINDSTR "model"

使用check_output时,您将"model"作为grep参数字面传递,但您应该只传递model"model"不在您的输出中(带引号),因此grep无法找到它,并返回exitcode 1,这不是grep的错误,而是{{1}触发异常,因为它需要check_output

所以我想把它作为一个quickfix:

0

作为一个longfix,我会直接用python执行adb_ouput = check_output(["adb","devices","-l","|", "grep", "model"],shell=True) 命令。

grep