2012-07-05 2 views
1

Я пытаюсь управлять терминалом с помощью Python. Согласно документации, которую я нашел, я должен использовать Popen для запуска команд терминала, с выходом stdin и stdout. К сожалению, это не работает:Не удается прочитать и написать из оболочки adb

import subprocess 
o = subprocess.Popen("adb shell",stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True) 
#for line in o: 
#print "I got",line 
print o.communicate("ls /") 
o.stdin.write("ls /") 
o.stdin.flush() 
print o.stdout.read() 
print o.readline(); 
print o.communicate() 

EDIT - я попытался monkeyrunner вместо этого, он, кажется, сделал для решения этой задачи, но, к сожалению, он терпит неудачу с ошибкой:

>>> device.shell('su') 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] Error executing command: su 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice]com.android.ddmlib.ShellCommandUnresponsiveException 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:408) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at com.android.ddmlib.Device.executeShellCommand(Device.java:388) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at com.android.chimpchat.adb.AdbChimpDevice.shell(AdbChimpDevice.java:269) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at com.android.monkeyrunner.MonkeyDevice.shell(MonkeyDevice.java:217) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at java.lang.reflect.Method.invoke(Method.java:616) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at org.python.core.PyReflectedFunction.__call__(PyReflectedFunction.java:175) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at org.python.core.PyObject.__call__(PyObject.java:355) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at org.python.core.PyMethod.__call__(PyMethod.java:215) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at org.python.core.PyMethod.instancemethod___call__(PyMethod.java:221) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at org.python.core.PyMethod.__call__(PyMethod.java:206) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at org.python.core.PyObject.__call__(PyObject.java:397) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at org.python.core.PyObject.__call__(PyObject.java:401) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at org.python.pycode._pyx19.f$0(<stdin>:1) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at org.python.pycode._pyx19.call_function(<stdin>) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at org.python.core.PyTableCode.call(PyTableCode.java:165) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at org.python.core.PyCode.call(PyCode.java:18) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at org.python.core.Py.runCode(Py.java:1197) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at org.python.core.Py.exec(Py.java:1241) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at org.python.util.PythonInterpreter.exec(PythonInterpreter.java:147) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at org.python.util.InteractiveInterpreter.runcode(InteractiveInterpreter.java:89) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at org.python.util.InteractiveInterpreter.runsource(InteractiveInterpreter.java:70) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at org.python.util.InteractiveInterpreter.runsource(InteractiveInterpreter.java:46) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at org.python.util.InteractiveConsole.push(InteractiveConsole.java:110) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at org.python.util.InteractiveConsole.interact(InteractiveConsole.java:90) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at org.python.util.InteractiveConsole.interact(InteractiveConsole.java:60) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at com.android.monkeyrunner.ScriptRunner.console(ScriptRunner.java:193) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at com.android.monkeyrunner.MonkeyRunnerStarter.run(MonkeyRunnerStarter.java:73) 
120706 08:29:28.433:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at com.android.monkeyrunner.MonkeyRunnerStarter.main(MonkeyRunnerStarter.java:189) 
+0

попробовать 'SHELL = true', но это не может быть безопасным и, вероятно, «получение привилегий root», которые вы делаете, неверно ... – JBernardo

+0

Вы правы, это был немой пример. См. Обновленный скрипт, он, по крайней мере, начался с shell = True, но все равно не работает. – NoBugs

+1

Что не работает? вы пытались использовать '.communicate'? – JBernardo

ответ

2

Хорошо. monkeyrunner может делать то, что вы показали, как пример:

#! /usr/bin/env monkeyrunner 

from com.android.monkeyrunner import MonkeyRunner 

cmd = 'ls /' 
print cmd+':', MonkeyRunner.waitForConnection().shell(cmd) 
+0

Где я могу получить этот пакет? У меня Android SDK, но я не могу его импортировать. – NoBugs

+0

Вы должны использовать monkeyrunner в качестве интерпретатора –

+0

Nice find. Он отлично работает для некоторых команд, но я не могу запустить «su», хотя суперпользователь говорит, что это разрешено. – NoBugs

1

попробовать:

o = subprocess.Popen(["adb", "shell"],stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True) 

команда должна быть списком, на который я верю. Убедитесь, что adb находится на пути процесса python.

+1

Команда должна быть * последовательностью * – cdarke

+1

Но только если 'shell = False' (по умолчанию) , Оболочка ожидает командной строки. – glglgl

0

вы можете попробовать:

import os 
ls=os.popen('ls').read() 
0

Try:

import subprocess 
o = subprocess.Popen(["adb", "shell"],stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
o.stdin.write("ls /") 
o.stdin.write("\n") 
o.stdin.flush() 
o.stdout.readline() 
Смежные вопросы