我如何使用Python执行adb命令?

时间:2012-05-27 15:15:34

标签: android python

我想创建一个可用于执行Android adb命令的python脚本。 我看了https://github.com/rbrady/python-adb,但似乎无法让它完美运作。 有什么建议?

4 个答案:

答案 0 :(得分:2)

这个工具应该做的工作。 https://pypi.python.org/pypi/pyadb/0.1.1

我必须修改一些函数才能让它在Python 2.7上运行并使用子进程代替。这是我的版本中的修改代码:

def __build_command__(self,cmd):
    if self.__devices is not None and len(self.__devices) > 1 and self.__target is None:
        self.__error = "Must set target device first"
        return None

    if type(cmd) is tuple:
        a = list(cmd)
    elif type(cmd) is list:
        a = cmd
    else:
        a = [cmd]
    a.insert(0, self.__adb_path)
    if self.__target is not None:
        a.insert(1, ['-s', self.__target])

    return a

def run_cmd(self, cmd):
    """
    Run a command against adb tool ($ adb <cmd>)
    """
    self.__clean__()

    if self.__adb_path is None:
        self.__error = "ADB path not set"
        return

    try:
        args = self.__build_command__(cmd)
        if args is None:
            return
        # print 'args>', args
        cmdp = subprocess.Popen(args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        self.__output, self.__error = cmdp.communicate()
        retcode = cmdp.wait()
        # print 'stdout>', self.__output
        # print 'stderr>', self.__error
        if retcode < 0:
            print >>sys.stderr, "Child was terminated by signal", -retcode
        else:
            return
    except OSError, e:
        self.__error = str(e)

    return

答案 1 :(得分:1)

使用monkeyrunner工具。从documentation开始:

  

除了使用monkeyrunner API本身,您还可以使用标准的Python操作系统和子进程模块来调用Android工具,例如Android Debug Bridge。

答案 2 :(得分:0)

通常,在安装adb之后,我们使用subprocess.call('adb devices')。但是,当您的命令变得更加复杂(一个以上的设备等等)时,这种方式将是可怕的。

为了获得更好的代码,我使用pyatool处理此问题。

from pyatool import PYAToolkit


def test_b(toolkit):
    return 'i am test_b, running on {}'.format(toolkit.device_id)


# bind adb command
PYAToolkit.bind_cmd(func_name='test_a', command='shell pm list package | grep google')
# or a complex, custom function
PYAToolkit.bind_func(real_func=test_b)

# after binding, you can start using them directly
# if your device id is 123456F
d = PYAToolkit('123456F')
result_a = d.test_a()
result_b = d.test_b()

您可以查看github page以获得详细信息。

答案 3 :(得分:-1)

python-adb项目实现了USB通信层及以上,甚至提供了类似Android adb的API以便于转换。