python三种方式自动获取多个安卓adb设备名

方法1:

使用os.popen方式

import os

def check_adb_devices():
    '''
    检查adb 设备,并返回设备sn list
    
    :return: 设备sn list
    '''
    adb_list=[]
    ret =os.popen('adb devices').readlines()
    print('ret={}'.format(ret))
    if len(ret) ==1:
        print('未识别到adb 设备...')
        return adb_list
    else:
        for n in ret:
            if '\tdevice\n' in n:
                adb=str(n).strip().split('\tdevice')[0].strip()
                adb_list.append(str(adb))

        print('adb设备数量={},adb_list={}'.format(len(adb_list), adb_list))
        return adb_list


if __name__ == '__main__':
    check_adb_devices()

执行结果:

ret=['List of devices attached\n', '1234a4f3\tdevice\n', 'mn4xwsbfrd\tdevice\n', '\n']
adb设备数量=2,adb_list=['1234a4f3', 'mn4xwsbfrd']

方法2:

使用正则表达式方式匹配

def check_adb_devices_re():
    '''
    用re正则方式获取adb 列表,并返回设备sn list
    
    :return: 设备sn list
    '''
    # 获取所有的安卓设备SN号码
    devices_list = []
    str_list = os.popen('adb devices').readlines()
    print(str_list)
    count = 0
    for i in str_list:
        if '\tdevice' in i:
            device_name = ''
            device_name = re.sub('\tdevice', '', i).replace('\n', '').strip()
            print("Device_{}_name={}".format(count, device_name))
            devices_list.append(device_name)
            count = count + 1
    print("devices={},devices_list={}".format(count,devices_list))
    return devices_list

执行结果:

['List of devices attached\n', '1234a4f3\tdevice\n', '\n']
Device_0_name=1234a4f3
devices=1,devices_list=['1234a4f3']

方法3:

实际使用中发现,方法1和方法2在直接运行python文件的时候没有问题,但是把py文件打包成exe程序后,就会出现无法获取到cmd命令的返回值,经过分析为:打包后程序的cmd调试窗口被禁用了,就会导致程序无法获取返回值。

解决方法:

将adb devices的返回结果写入到txt文件中,再逐行读取,并进行字符串匹配,检测实际的adb设备名;

代码实现

运行cmd指令函数

def run_cmd( cmd_str='', echo_print=1):
    """
    执行cmd命令,不显示执行过程中弹出的黑框

    备注:subprocess.run()函数会将本来打印到cmd上的内容打印到python执行界面上,所以避免了出现cmd弹出框的问题

    :param cmd_str: 执行的cmd命令
    :return: 
    """
    from subprocess import run
    if echo_print == 1:
        print('\n执行cmd指令="{}"'.format(cmd_str))
    run(cmd_str, shell=True)

获取多个adb设备名的函数

def check_adb_devices_ini():
    global devices_list
    import os
    import re
    
    # 获取所有的安卓设备SN号码
    devices_list = []
    adb_devices_file = '.\\Config\\adb.ini'
    if os.path.exists(adb_devices_file):
        run_cmd('del /f /q ' + adb_devices_file)
    print(run_cmd('adb devices >' + adb_devices_file))
    
    f = open(adb_devices_file, "r")
    str_list = f.readlines()
    print(str_list)
    if 'device' not in str(str_list[1]):
        print('adb devices:{}。未识别到任何adb设备,请确认安卓设备已正确连接且USB调试已打开...'.format(str_list))
        print("未识别到任何设备,请确认设备已正确连接上...")
        return -1
    
    count = 1
    for i in str_list:
        if '\tdevice' in i:
            device_name = ''
            device_name = re.sub('\tdevice', '', i).replace('\n', '').strip()
            print("Device_{}_name={}".format(count, device_name))
            devices_list.append(device_name)
            count = count + 1
    print("devices_list={}".format(devices_list))
    return devices_list

调用方法

if __name__ == '__main__':
    check_adb_devices_ini()

执行结果

执行cmd指令="del /f /q .\Config\adb.ini"

执行cmd指令="adb devices >.\Config\adb.ini"
None
['List of devices attached\n', '3123caad\tdevice\n', 'mn4xwsb3ed\tdevice\n', '\n']
Device_1_name=3123caad
Device_2_name=mn4xwsb3ed
devices_list=['3123caad', 'mn4xwsb3ed']

今日美图

 

 

 

 

 

 

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐