subprocess模块
官方推出subprocess模块是为了提供统一的模块来实现对系统命令或脚本的调用。
三种执行命令的方法
subprocess.run()
subprocess.call()
subprocess.Popen()
run()方法
subprocess.run(['df', '-h'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True)
stdout标准输出,stdin标准输入,stderr标准错误
subprocess.PIPE是把结果存到管道里进行缓存
call()方法
a = subprocess.call(['df', '-h'])
执行命令,返回命令执行状态,0 或 非0
subprocess.check_call(['ls', '-l'])
如果命令结果为0,就正常返回,否则抛出异常
subprocess.getstatusoutput('ls /bin/ls')
接收字符串格式命令,返回元组形式,第一个元素为执行状态,第二个元素为命令结果(0,'/bin/ls')
subprocess.getoutput('ls /bin/ls')
接收字符串格式命令,返回结果
a = subprocess.check_output(['ls', '-l'])
执行命令并返回结果,需要有接收返回值的变量
Popen()方法
常用参数:
args:shell命令,可以是字符串或者序列类型(如:list,元组)
stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄
preexec_fn:只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用
shell:同上
cwd:用于设置子进程的当前目录
env:用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。
a = subprocess.run('sleep 10', shell=True, stdout=subprocess.PIPE)
a = subprocess.Popen('sleep 10', shell=True, stdout=subprocess.PIPE)
注意:windows encoding='gbk' linux/mac 默认uft-8
print(a.stdout.read())输出结果
run方法 在主程序执行
Popen方法 发起一个新的子进程,不影响主程序
pid 获取所启动的进程的进程号
poll() 检测子进程是否终止,返回返回代码
wait() 等待发起的进程结束
terminate() 终止所启动的进程
kill() 杀死所启动的进程
communicate() 和启动的进程交互,通过stdin发送数据,通过stdout接收输出数据 只能交互一次