python 获取多台设备列表

本文介绍了一个Python脚本,用于通过ADB命令获取连接到计算机的所有Android设备的设备ID。脚本首先执行'adb devices'命令来收集设备信息,然后使用正则表达式从输出中解析出设备名称。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#coding=utf-8
import re
import os
def get_deviceid():                            
    str_init=' '                             
    all_info= os.popen('adb devices').readlines()
    print('adb devices 输出的内容是:',all_info)

    for i in range(len(all_info)):
        str_init+=all_info[i]                 
    devices_name=re.findall('\n(.+?)\t',str_init,re.S)   

    print('所有设备名称:\n',devices_name)
get_deviceid()

<think>嗯,用户想用Python和uiautomator2实现多台设备同时运行相同的操作。首先我得回忆一下uiautomator2的基本用法,然后考虑多设备并行的问题。 用户之前可能已经知道单设备怎么操作,但现在需要扩展到多设备。多设备并行通常需要同时连接多个设备,每个设备有独立的会话。这时候可能需要多线程或者多进程来处理每个设备的连接和操作。 我记得uiautomator2是通过设备的序列号来区分的,所以每个设备应该有一个唯一的serial。用户需要先获取所有连接的设备列表,然后为每个设备启动一个线程或进程,执行相同的步骤。 不过,线程和进程之间如何管理呢?比如,启动多个线程,每个线程对应一个设备,然后在这些线程中执行操作。Python的threading模块可以用于多线程,但需要注意GIL的问题,不过对于IO密集型任务,多线程应该没问题。 另外,用户提到的“相同操作”可能需要将操作步骤封装成一个函数,然后让每个设备线程调用这个函数。这样代码结构会更清晰,也便于维护。 还要考虑设备的连接和初始化。每个线程里可能需要用uiautomator2的Device对象,传入对应的serial,然后执行初始化操作,比如连接设备、安装必要的应用等。 用户可能还需要处理设备之间的同步问题,或者异常处理,比如某个设备断开连接时不影响其他设备。这时候需要在每个线程中加入异常捕获,确保一个设备的错误不会导致整个程序崩溃。 另外,参考之前用户提到的Appium多设备并行的例子,他们是通过启动多个Appium Server,每个设备对应一个Server。但uiautomator2可能不需要这样,因为它直接通过adb连接设备,可能更简单一些。不过需要确认uiautomator2是否支持同时连接多个设备而无需额外配置。 可能需要测试一下,比如同时连接两个设备,分别执行点击操作,观察是否都能成功。如果有问题,可能需要调整代码,比如使用不同的端口或者不同的serial来区分设备。 最后,代码示例部分需要展示如何遍历设备列表,启动线程,执行操作。可能还需要处理设备断开的情况,以及如何关闭连接。 总之,步骤大概是:获取设备列表,为每个设备创建线程,在每个线程中初始化设备执行操作,处理异常,最后等待所有线程完成。</think>以下是通过Python和uiautomator2实现多设备并行执行相同操作的具体实现方法: ### 一、实现原理 1. 通过adb获取已连接设备列表,每个设备使用独立线程控制 2. 使用uiautomator2的`Device`对象绑定不同设备序列号 3. 通过线程池实现真正的并行操作(非串行) ### 二、实现步骤 #### 1. 环境准备 ```python import uiautomator2 as u2 from concurrent.futures import ThreadPoolExecutor ``` #### 2. 设备连接管理 ```python def get_devices(): """获取已连接设备列表""" import subprocess output = subprocess.check_output(["adb", "devices"]).decode() return [line.split()[0] for line in output.splitlines() if "\tdevice" in line] ``` #### 3. 核心操作封装 ```python def device_operation(serial): """单个设备操作模板""" d = u2.connect(serial) # 绑定设备序列号 # 在此处编写需要并行执行的通用操作 d.app_start("com.example.package") # 示例:启动应用 d(text="Login").click() # 示例:点击登录按钮 d.screenshot(f"{serial}_login.png") # 保存设备专属截图 ``` #### 4. 并行执行框架 ```python def parallel_execute(max_workers=5): devices = get_devices() with ThreadPoolExecutor(max_workers=max_workers) as executor: executor.map(device_operation, devices) ``` ### 三、完整实现示例 ```python import uiautomator2 as u2 from concurrent.futures import ThreadPoolExecutor import subprocess class MultiDeviceController: def __init__(self): self.devices = self._get_devices() def _get_devices(self): output = subprocess.check_output(["adb", "devices"]).decode() return [line.split()[0] for line in output.splitlines() if "\tdevice" in line] def common_operations(self, serial): try: d = u2.connect(serial) d.implicitly_wait(10) # 示例操作流程 d.app_start("com.android.settings") d(text="Wi‑Fi").click() d(text="Add network").click() # 更多自定义操作... except Exception as e: print(f"设备 {serial} 执行异常: {str(e)}") def run_parallel(self): with ThreadPoolExecutor(max_workers=len(self.devices)) as executor: executor.map(self.common_operations, self.devices) if __name__ == "__main__": controller = MultiDeviceController() controller.run_parallel() ``` ### 四、关键注意事项 1. **设备识别**:确保每台设备已开启USB调试模式并通过`adb devices`可见 2. **线程安全**:每个设备操作应保持独立上下文,避免共享资源 3. **异常处理**:单个设备异常不应影响其他设备执行 4. **性能优化**:建议同时连接的设备数不超过CPU核心数*2[^3] 5. **设备初始化**:推荐提前执行`u2.init()`初始化所有设备 ### 五、扩展优化方向 1. **动态负载均衡**:根据设备性能动态分配任务 2. **操作同步机制**:实现跨设备状态同步 3. **结果收集系统**:集中收集各设备执行日志和截图 4. **设备池管理**:实现设备的自动重连和故障转移
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值