2017-03-19 27 views
0

我想连接两台设备到我的电脑,并使用python和adb在它们上运行一些命令。 当我从命令提示符运行命令,它通过罚款,但是当我把它们放在python脚本中,他们给我错误。 这是造成错误的所有时间:subprocess.check_output无法执行一个命令,但同样在Windows中工作

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脚本中执行相同的操作, =真”,也没有)

如:

adb devices -l | FINDSTR "model" 

这让我没有任何问题的ouptut。 我得到的输出是

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

bd00051a4设备产品:YYYYYYYYYY型号:YYYYYYYYYY设备: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

我觉得我接近,但就是不能把我的手指上。 任何帮助,将不胜感激。

回答

2

首先

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

当然需要shell=True,但即使这不是等同于

adb devices -l | FINDSTR "model" 

使用check_output,你传递"model"grep参数字面上但你应该通过刚刚model"model"不在您的输出中(带引号),因此grep未能找到它,并返回出口代码1,这对grep不是真的错误,但会使check_output触发异常,因为它预计为0

所以我会以这个作为的quickfix:

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

而作为一个longfix我使用python直接执行grep命令。

adb_output = check_output(["adb","devices","-l"]) 
for l in adb_output.splitlines(): 
    if "model" in l: 
     print(l) 
+0

我确实尝试过没有引号,但它失败了。 我坚持要在python中过滤输出,而不是使用grep。感谢你的回答。 –

+0

我不明白为什么它不起作用,但第二种解决方案反正更好。你甚至可以想象把它放在没有'grep'的机器上。 –

相关问题