1

I am trying to connect two devices to my pc and run some commands on them using python and adb. when I run the command from the command prompt, it goes through fine, but when i put those in the python script, they give me errors. this is causing the errors all the time:

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

The error message I get is this:

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

When I try the same code without the grep command, it works

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

It gives me the right output.

When I try the same in windows command prompt, It works fine (I am replacing grep with FINDSTR because i'm using it in windows, and I have tried doing the same in the python script as well, with 'shell = True' and also without.)

eg:

adb devices -l | FINDSTR "model"

This gives me an ouptut without any problems. The output I get is

123ab6ef device product:xxxxxxxxx model:xxxxxxxxx device:xxxxxxxxx

bd00051a4 device product:yyyyyyyyyy model:yyyyyyyyyy device:yyyyyyyyy

I am trying to understand where I am going wrong here, but can't figure it out. So far I have checked the docs: https://docs.python.org/3/library/subprocess.html https://docs.python.org/3/library/subprocess.html#subprocess.CalledProcessError These just give me the error codes.

I have also looked at these answers: Python, adb and shell execution query I took some error checking from here and added to my code.

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

I think i am close but just can't put my finger on it. Any help would be appreciated.

Community
  • 1
  • 1
aabb bbaa
  • 195
  • 1
  • 3
  • 14

1 Answers1

2

First

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

certainly requires shell=True, but even with that it's not equivalent to

adb devices -l | FINDSTR "model"

When using check_output, you're passing "model" as grep argument literally but you should pass just model. "model" is not in your output (with quotes) so grep fails to find it, and returns exitcode 1 which is not really an error for grep but makes check_output trigger an exception because it expects 0.

So I would to this as a quickfix:

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

And as a longfix I'd perform the grep command directly with python.

adb_output = check_output(["adb","devices","-l"])
for l in adb_output.splitlines():
     if "model" in l:
         print(l)
Jean-François Fabre
  • 137,073
  • 23
  • 153
  • 219
  • I did try it without the quotes as well, but it fails. I am sticking to filtering my output in python instead of using grep. Thanks for the answer. – aabb bbaa Mar 21 '17 at 17:34
  • I don't understand why it doesn't work, but the second solution is better anyway. You could even imagine putting that on a machine that doesn't have `grep`. – Jean-François Fabre Mar 21 '17 at 20:29