python 执行系统命令后获取返回值
# #!/usr/bin/env python # -*- coding: utf-8 -*- import subprocess import os # 方法一:os.system() # 返回值:返回对应状态码,且状态码只会有0(成功)、1、2。 # 其它说明:os.system()的返回值并不是执行程序的返回结果。而是一个16位的数,它的高位才是返回码。也就是说os.system()执行返回256即 0×0100,返回码应该是其高位0×01即1。所以要获取它的状态码的话,需要通过>>8移位获取。 def adb_shell(cmd): exit_code = os.system(cmd) return exit_code>>8 # # os.system(cmd)命令会直接把结果输出,所以在不对状态码进行分析处理的情况下,一般直接调用即可 # os.system(cmd) # # 方法二:os.popen() # # 返回值:返回脚本命令输出的内容 # # 其它说明:os.popen()可以实现一个“管道”,从这个命令获取的值可以继续被调用。而os.system不同,它只是调用,调用完后自身退出,执行成功直接返回个0。 # def adb_shell(cmd): # result = os.popen(cmd).read() # return result # # 方法三:subprocess.Popen() # # 返回值:Popen类的构造函数,返回结果为subprocess.Popen对象,脚本命令的执行结果可以通过stdout.read()获取。 # def adb_shell(cmd): # # 执行cmd命令,如果成功,返回(0, 'xxx');如果失败,返回(1, 'xxx') # res = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 使用管道 # result = res.stdout.read() # 获取输出结果 # res.wait() # 等待命令执行完成 # res.stdout.close() # 关闭标准输出 # return result # # 方法四:subprocess.getstatusoutput() # # 返回值:返回是一个元组,如果成功,返回(0, 'xxx');如果失败,返回(1, 'xxx') # def adb_shell(cmd): # result = subprocess.getstatusoutput(cmd) # return result cmd = 'adb shell dumpsys activity | grep "Run #"' print(adb_shell(cmd))
四种方法中,需要根据不同需求来采用对应不同方法。
1.如果不需要对执行结果内容进行处理的,可以用方法一的os.system(),当然,也可以用其它三种方法。
2.由于方法一的os.system()会直接将执行结果输出来,不受我们控制。如果不想要把结果直接输出来,则只能采用后面三种方法。
3.subprocess.getstatusoutput()其实是对subprocess.Popen()的封装,两者的区别是subprocess.getstatusoutput()返回一个带有状态码status和结果output的元组,而subprocess.Popen()则直接返回结果output。
参考链接:https://testerhome.com/topics/20497
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通