本文实例讲述了Python subprocess模块功能与常见用法。分享给大家供大家参考,具体如下:
一、简介
subprocess最早在2.4版本引入。用来生成子进程,并可以通过管道连接他们的输入/输出/错误,以及获得他们的返回值。
subprocess用来替换多个旧模块和函数:
- os.system
- os.spawn*
- os.popen*
- popen2.*
- commands.*
运行python的时候,我们都是在创建并运行一个进程,linux中一个进程可以fork一个子进程,并让这个子进程exec另外一个程序。在python中,我们通过标准库中的subprocess包来fork一个子进程,并且运行一个外部的程序。subprocess包中定义有数个创建子进程的函数,这些函数分别以不同的方式创建子进程,所欲我们可以根据需要来从中选取一个使用。另外subprocess还提供了一些管理标准流(standard stream)和管道(pipe)的工具,从而在进程间使用文本通信。
二、旧有模块的使用
1. os.system()
import os
# 0 表示执行成功
a = os.system("df -Th")
# 返回非 0 表示执行错误
os.system("list")
2. os.popen()
执行操作系统的命令,会将结果保存在内存当中,可以用 read()
方法读取出来.
import os
# <open file 'ls -l', mode 'r' at 0x7f02d249c390>
res = os.popen("ls -l")
print( res.read())
三、subprocess模块
1、subprocess.run()
import subprocess
# python 解析则传入命令的每个参数的列表
subprocess.run(["df","-h"])
#需要交给Linux shell自己解析,则:传入命令字符串,shell=True
subprocess.run("df -h|grep /dev/sda1",shell=True)
2、subprocess.call()
执行命令,返回命令的结果和执行状态,0或者非0
# 命令执行状态
res = subprocess.call(["ls","-l"])
3、subprocess.check_call()
执行命令,返回结果和状态,正常为0 ,执行错误则抛出异常
subprocess.check_call(["ls","-l"])
4、subprocess.getstatusoutput()
接受字符串形式的命令,返回 一个元组形式的结果,第一个元素是命令执行状态,第二个为执行结果
#执行正确
subprocess.getstatusoutput('pwd')
(0, '/root')
#执行错误
subprocess.getstatusoutput('pd')
(127, '/bin/sh: pd: command not found')
5、subprocess.getoutput()
接受字符串形式的命令,放回执行结果
subprocess.getoutput('pwd')
'/root'
6、subprocess.check_output()
执行命令,返回执行的结果,而不是打印
>>> res = subprocess.check_output("pwd")
>>> res
b'/root\n'