2013-12-23 2 views
2

Я пытаюсь получить результат выполнения команды ADB, используя следующий код:Получение ADB вывода с помощью Python

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


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

Любая идея, почему не эта команда работает?

Это ошибка я вижу:

OSError: [Errno 2] No such file or directory 

я могу получить выход в os.system, но он не для подпроцесса

+1

Прочитайте [документы подпроцесса] (http://docs.python.org/2/library/subprocess.html#frequently-used-arguments). Передайте команду как список. Используйте 'check_output()'. 'os.system()' не может заставить вас выводить, он возвращает статус выхода. – jfs

ответ

1
import subprocess 

def adbshell(command, serial=None, adbpath='adb'): 
    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'): 
    return adbshell('pm path {}'.format(pname), serial=serial, adbpath=adbpath) 
+0

Если 'pname' может содержать пробел в нем, вы можете использовать' pipe.quote (pname) ', чтобы избежать его для оболочки (предполагая синтаксис'/bin/sh'-like): '' pm path {} '. Format (pipe.quote (pname)) 'если команда должна быть строкой. В противном случае передайте команду в виде списка: 'args.extend (['shell'] + command)'. – jfs

-1

Вы должны использовать check_output, ниже мой код, который успешно работает.

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 

Чтобы узнать, подключено устройство, позвоните isAdbConnected(). Надеюсь помочь тебе.

Смежные вопросы