【问题标题】:execute adb commands in cmd prompt from python script从 python 脚本在 cmd 提示符下执行 adb 命令
【发布时间】:2017-02-09 07:35:40
【问题描述】:

我正在尝试从 python 脚本以自动方式执行 adb 命令。请注意,我在 Windows 中使用 python 2.7。 如果我手动做的话,顺序是这样的:

C:\Project\python>adb shell
login:<enter login id e.g. root>
Password: <enter password e.g. test>
Last login: Thu Feb  9 12:29:46 UTC 2017 on pts/0
~ # date
date
Thu Feb  9 12:55:06 UTC 2017

我正在尝试从 python 脚本处理这个序列。我曾尝试使用 subprocess.call("adb shell date") 但它失败了,如果不登录就无法执行命令。我不知道如何传递登录 ID 和密码。抱歉这个菜鸟问题,因为我对 Python 很陌生。

感谢您的帮助!!

干杯

【问题讨论】:

    标签: python-2.7 adb


    【解决方案1】:

    试试subprocess.Popen:

    import subprocess
    
    cmd_input = """<enter login id e.g. root>
    <enter password e.g. test>
    date"""
    
    process = subprocess.Popen(
        "adb shell",
        shell=True,
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE
    )
    process.communicate()
    for i in cmd_input.split("\n"):
        process.communicate(i + "\n")
    

    或者:

    process = subprocess.Popen(
        "adb shell",
        shell=True,
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE
    )
    process.communicate(user + "\n")
    process.communicate(pwd + "\n")
    process.communicate(cmd + "\n")
    

    另一种选择是使用google/python-adbadb via pip

    【讨论】:

    • 澄清一下,<..> 中的 cmets 仅用于表示我手动执行的操作。我尝试了 cmd_input = "root test date" 然后 subprocess.call("adb shell", shell=True, input=cmd_input)。但是我收到了这个错误 Traceback (last recent call last): File "subprocess_login.py", line 4, in subprocess.call("adb shell", shell=True, input=cmd_input) File "C:\ Python27\lib\subprocess.py",第 524 行,调用 return Popen(*popenargs, **kwargs).wait() TypeError: __init__() got an unexpected keyword argument 'input'
    • @wicked_snail 我知道,我只是将它们复制过来。 input是我的错误,我查看了Python3文档。
    • 我试过 user = "root" pwd = "test" cmd = "date" 。在执行 subprocess.Popen("adb shell", shell=True).communicate("{}\n{}\n{}\n".format(user,pwd,cmd)) 时,我得到 C:\Project\ MMC\python>python subprocess_login.py mdm9607 login: 所以它要求手动输入凭据。但我希望它登录并执行脚本中的命令。
    • 我尝试了第二个选项,但它在执行后挂起。 60 秒后,它退出执行。可能是因为登录超时是 60 秒。如果我在中间退出,它会给出:文件“C:\Python27\lib\subprocess.py”,第 1033 行,在 _communicate stdout_thread.join() 文件“C:\Python27\lib\threading.py”,第 947 行,在加入 self.__block.wait() 文件“C:\Python27\lib\threading.py”,第 339 行,在等待 waiter.acquire() KeyboardInterrupt
    • 我打印了标准输出:'root\r\r\ntest\r\r\ndate\r\r\nmdm9607 login: \r\r\n60 秒后登录超时。\r\ r\n'
    【解决方案2】:

    process.communicate('command_to_send\n') 遇到错误

    TypeError: a bytes-like object is required, not 'str'
    

    通过以下方式使用子进程通信命令解决了 TypeError:

    process.communicate(b'input keyevent KEYCODE_CALL\n')
    

    【讨论】:

    • 请记住,这仅适用于 Python3,默认情况下,Python2 将所有内容作为字节串(而不是 unicode )处理。
    猜你喜欢
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    相关资源
    最近更新 更多