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']
今日美图