Reputation: 4441
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
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
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
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
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