Siddharthan Asokan
Siddharthan Asokan

Reputation: 4441

Getting the adb output using Python

I'm trying to get the output of a adb command using the following code:

pathCmd = './adb shell pm path ' + packageName


pathData = subprocess.Popen(pathCmd,stdout = subprocess.PIPE)
result = pathData.stdout.read()
print result

Any idea why doesn't this command work?

This is the error I see:

OSError: [Errno 2] No such file or directory

I can get the output as os.system but it fails for a subprocess

Upvotes: 5

Views: 8783

Answers (4)

user23359758
user23359758

Reputation: 31

I tried this in python and it worked for me. This will get the correct version value even if it is in float.

import subprocess

def get_android_os():
    get_os_version = subprocess.check_output("adb shell getprop ro.build.version.release", shell=True)
    os_version = get_os_version.decode("utf-8")
    os_version = str(os_version)
    os_version = os_version.strip()

Upvotes: 1

Prashanth Sams
Prashanth Sams

Reputation: 21149

from subprocess import Popen, PIPE

with Popen(['adb devices'], shell=True,stdout=PIPE) as proc:
    for val in proc.stdout.readlines()[1:-1]:
        print(val.decode('UTF-8').replace('device', '').strip())

Upvotes: 0

Alex P.
Alex P.

Reputation: 31686

import subprocess

ADB_PATH="adb"

def adbdevices(adbpath=ADB_PATH):
    return set([device.split('\t')[0] for device in subprocess.check_output([adbpath, 'devices']).splitlines() if device.endswith('\tdevice')])

def adbshell(command, serial=None, adbpath=ADB_PATH):
    args = [adbpath]
    if serial is not None:
        args.extend(['-s', serial])
    args.extend(['shell', command])
    return subprocess.check_output(args)

def pmpath(pname, serial=None, adbpath=ADB_PATH):
    return adbshell('pm path {}'.format(pname), serial=serial, adbpath=adbpath)

Upvotes: 1

yanzi1225627
yanzi1225627

Reputation: 963

You should use check_output, below is my code which works successfully.

from subprocess import check_output, CalledProcessError

from tempfile import TemporaryFile

def __getout(*args):
    with TemporaryFile() as t:
        try:
            out = check_output(args, stderr=t)
            return  0, out
        except CalledProcessError as e:
            t.seek(0)
            return e.returncode, t.read()

# cmd is string, split with blank
def getout(cmd):
    cmd = str(cmd)
    args = cmd.split(' ')
    return __getout(*args)

def bytes2str(bytes):
    return str(bytes, encoding='utf-8')

def isAdbConnected():
    cmd = 'adb devices'
    (code, out) = getout(cmd)
    if code != 0:
        print('something is error')
        return False
    outstr = bytes2str(out)
    if outstr == 'List of devices attached\n\n':
        print('no devices')
        return False
    else:
        print('have devices')
        return True

Call isAdbConnected() to check whether device is connected. Hope to help you.

Upvotes: 0

Related Questions