Python中执行外部命令
有很多需求需要在Python中执行shell命令、启动子进程,并捕获命令的输出和退出状态码,类似于Java中的Runtime类库。
subprocess模块的使用:#
Python使用最广泛的是标准库的subprocess模块,用来替换os.system(),os.spawn*(),os.popen*()和commands.*等模块与函数。
使用subprocess最简单的方式就是用它提供的便利函数,call,check_all与check_output,当便利函数满足不了要求再使用Popen类。
1. call #
subprocess(args,*,stdin=None,stout=None,stderr=None,shell=False)
shell=True,Python会先运行一个shell,再用shell解释字符串,而不是传递一个列表。
2. check_call#
check_all与call类似,只是遇到异常情况返回的形式不同,它会抛出subprocess.CalledProcessError异常
3. check_output#
这个便利函数是使用最多了,它可以获取命令的结果,而不是退出状态码
如果想要捕捉退出状态码,可以通过抛出的subprocess.CalledProcessError异常
1 2 3 4 5 6 7 | import subprocess try : output = subprocess.check_output( 'ls /zz' ,shell = True ) except subprocess.CalledProcessError as e: output = e.output code = e.returncode print (code,output) |
执行结果:
如果想捕获命令的错误输出,需将错误输出重定向到标准输出
subprocess.check_output(['cmd','arg1','arg2'],stderr=subprocess.STDOUT)
4. 使用Popen#
下面的exexute_cmd函数对Popen,进行了封装,执行成功,返回标准输出和状态码,失败是返回状态码和错误输出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #!/usr/bin/python #coding=utf8 import subprocess def execute_cmd(cmd): p = subprocess.Popen(cmd, shell = True , stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE) stdout, stderr = p.communicate() if p.returncode ! = 0 : return p.returncode, stderr return p.returncode, stdout if __name__ = = '__main__' : cmd = 'ls /u01' returncode,out = execute_cmd(cmd) if returncode ! = 0 : raise SystemExit( 'execute {0} err :{1}' . format (cmd,out)) else : print ( "execute command ({0} sucessful)" . format (cmd)) |
目录不存时:
【推荐】国内首个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代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了