目录:
一、概述
二、os包
三、subprocess包
四、对比
五、参考文章
一、概述
python与shell交互的方式有一下几种:os.system()
os.popen()
commands包
subprocess包
二、os包
os.system([cmd])
执行CMD,返回CMD的状态码(0 - 成功,其他 - 失败或被中断)
无管道
os.popen([CMD], [mode = 'r' | 'w' ], buffersize)
开启子shell执行CMD,返回执行命令的输入流 或输出流文件对象。文件对象可读写,但只能进行读或写
底层通过os的 管道技术 实现
单向管道(只能读或写)
import os#使用读通道f = os.popen("ls -l")f.read()#使用写管道#需要提前写好echo文件'''#echo.pywhile True:in = input()if in == "quit" or in == "exit":print("Bye")breakprint("[-] ", in)'''f = os.popen("python echo.py", "w")f.write("hello")
二、subprocess包
subprocess 模块通过os 底层的 管道技术 实现
模块提出的目标是替代:
os.system
、os.spawn*
等函数
功能:开启子进程运行命令
不阻塞父进程
支持双向管道
参数check为True时,可能会引发异常
run
函数是对Popen
类封装后形成的简单函数功能:获取子进程中执行命令的返回码和结果
返回值:(retcode, stdout)元组
不阻塞父进程
不支持管道
命令执行错误时,不引发异常
功能: 获取子进程中执行命令的输出结果
返回值:执行命令的结果
不阻塞父进程
不支持管道
命令执行错误时,不引发异常
功能: 检查在子进程中运行命令
返回值: 程序的运行结果。(如果命令返回码为0,返回运行结果;否则,直接抛出
CalledProcessError
异常)不阻塞父进程
不支持stdout的管道
指定参数:stderr = STDOUT 可捕获错误信息
支持参数:
input
功能:检查在子进程中运行命令的执行情况
返回值:0。(命令退出码为0时,返回0;否则,无返回值,直接引发
CalledProcessError
异常)阻塞父进程,直到该函数结束
结束条件: 命令执行完成 或 超时
不支持管道
功能:调用子进程运行命令
返回值:0 或 非0值
阻塞父进程,直到该函数结束
结束条件:命令执行完成或超时
用于代替
os.system()
不支持管道
call(*popenargs, timeout= None, **kwargs)
check_call(*popenargs, **kwargs)
check_output(*popenargs, timeout=None, **kwargs)
getoutput(cmd)
getstatusoutput(cmd)
run(args, *, stdin = None, input = None, stderr = None, shell = False, cwd = None, timeout = None, check = False, encoding = None, errors = None)