python封装执行cmd命令的方法

简介: python封装执行cmd命令的方法

一、前置说明


在自动化时,经常需要使用命令行工具与系统进行交互,因此可以使用python封装一个执行cmd命令的方法。


二、代码实现


import subprocess
import time
from common.exception import RunCMDError
from common.logger import logger
class CmdRunner:
    @staticmethod
    def run_command(command, timeout=5, retry_interval=0.5):
        end_time = time.time() + timeout
        attempts = 0
        while True:
            try:
                # subprocess.run() 方法用于执行命令并等待其完成,然后返回一个 CompletedProcess 对象,该对象包含执行结果的属性。
                # 它适用于需要等待命令完成并获取结果的情况。
                result = subprocess.run(command, shell=True, capture_output=True, text=True, timeout=timeout)
                # 如果 returncode==0,则直接return
                if result.returncode == 0:
                    # 通常情况下,执行成功时,命令行不会返回任何结果,此时result为'',因此添加这个判断
                    output = result.stdout.strip() or 'successful'
                    logger.debug(f"Execute adb command successfully: {command}")
                    output, status = output, True
                    return output, status
                # 如果 returncode!=0 或 抛出异常时,则进入失败重跑。
                # 连续执行多条语句时,cmd命令之间需要一定时间间隔,失败重跑的机制,就是为了避免执行速度过快导致的错误。
                else:
                    logger.error(f"Execute adb command failure: {command}")
                    output, status = result.stderr.strip(), False
            except Exception as e:
                logger.error(f"Execute adb command failure: {e}")
                output, status = '', False
            time.sleep(retry_interval)
            attempts += 1
            logger.debug(f'Retrying... Attempt {attempts}')
            if time.time() > end_time:
                break
        return output, status
    def run_command_strict(self, command, timeout=5):
        output, status = self.run_command(command, timeout=timeout)
        if not status:
            raise RunCMDError(output)
        return output
cmd_runner = CmdRunner()
if __name__ == '__main__':
    import logging
    logging.basicConfig(level=logging.DEBUG)
    print(cmd_runner.run_command_strict('adb devices'))


三、Demo验证


运行代码,输出结果:

Execute adb command successfully: adb devices
List of devices attached
9YS0220306003185  device
192.168.2.103:5555  device
目录
相关文章
|
1月前
|
JSON 数据可视化 API
Python 中调用 DeepSeek-R1 API的方法介绍,图文教程
本教程详细介绍了如何使用 Python 调用 DeepSeek 的 R1 大模型 API,适合编程新手。首先登录 DeepSeek 控制台获取 API Key,安装 Python 和 requests 库后,编写基础调用代码并运行。文末包含常见问题解答和更简单的可视化调用方法,建议收藏备用。 原文链接:[如何使用 Python 调用 DeepSeek-R1 API?](https://apifox.com/apiskills/how-to-call-the-deepseek-r1-api-using-python/)
|
2月前
|
人工智能 自然语言处理 算法
随机的暴力美学蒙特卡洛方法 | python小知识
蒙特卡洛方法是一种基于随机采样的计算算法,广泛应用于物理学、金融、工程等领域。它通过重复随机采样来解决复杂问题,尤其适用于难以用解析方法求解的情况。该方法起源于二战期间的曼哈顿计划,由斯坦尼斯拉夫·乌拉姆等人提出。核心思想是通过大量随机样本来近似真实结果,如估算π值的经典示例。蒙特卡洛树搜索(MCTS)是其高级应用,常用于游戏AI和决策优化。Python中可通过简单代码实现蒙特卡洛方法,展示其在文本生成等领域的潜力。随着计算能力提升,蒙特卡洛方法的应用范围不断扩大,成为处理不确定性和复杂系统的重要工具。
96 21
|
2月前
|
运维 Shell 数据库
Python执行Shell命令并获取结果:深入解析与实战
通过以上内容,开发者可以在实际项目中灵活应用Python执行Shell命令,实现各种自动化任务,提高开发和运维效率。
80 20
|
2月前
|
数据挖掘 数据处理 开发者
Python3 自定义排序详解:方法与示例
Python的排序功能强大且灵活,主要通过`sorted()`函数和列表的`sort()`方法实现。两者均支持`key`参数自定义排序规则。本文详细介绍了基础排序、按字符串长度或元组元素排序、降序排序、多条件排序及使用`lambda`表达式和`functools.cmp_to_key`进行复杂排序。通过示例展示了如何对简单数据类型、字典、类对象及复杂数据结构(如列车信息)进行排序。掌握这些技巧可以显著提升数据处理能力,为编程提供更强大的支持。
50 10
|
22天前
|
SQL 关系型数据库 MySQL
Python中使用MySQL模糊查询的方法
本文介绍了两种使用Python进行MySQL模糊查询的方法:一是使用`pymysql`库,二是使用`mysql-connector-python`库。通过这两种方法,可以连接MySQL数据库并执行模糊查询。具体步骤包括安装库、配置数据库连接参数、编写SQL查询语句以及处理查询结果。文中详细展示了代码示例,并提供了注意事项,如替换数据库连接信息、正确使用通配符和关闭数据库连接等。确保在实际应用中注意SQL注入风险,使用参数化查询以保障安全性。
|
3月前
|
分布式计算 MaxCompute 对象存储
|
2月前
|
安全 Shell 数据处理
使用Python执行Shell命令并获取结果
在实际应用中,可以根据需要选择适当的参数和方法来执行Shell命令,并处理可能出现的各种情况。无论是系统管理、自动化任务还是数据处理,掌握这些技巧都将极大地提高工作效率。
96 12
|
3月前
|
安全
Python-打印99乘法表的两种方法
本文详细介绍了两种实现99乘法表的方法:使用`while`循环和`for`循环。每种方法都包括了步骤解析、代码演示及优缺点分析。文章旨在帮助编程初学者理解和掌握循环结构的应用,内容通俗易懂,适合编程新手阅读。博主表示欢迎读者反馈,共同进步。
|
JavaScript 前端开发 网络架构
python中封装与解构
python中封装与解构
175 0

热门文章

最新文章