subprocess模块是python自带的模块,它主要用来去掉一些旧的模块或方法,如os.system、os.spawn*、commands.*、os.popen*等,因此如果需要python执行外部命令或任务时,则优先使用subprocess模块。
1.Popen类
先来看下Popen类的构造参数(此处只列出常用的几个参数而已):
def __init__(self,
args,
stdin=None,
stdout=None,
stderr=None,
shell=False,
cwd=None, ):
- args:代表需要在操作系统执行的命令,可以是字符串形式(要求shell=True),也可以是列表形式
- stdin,stdout,stderr指定了标准输入、输出、错误;值为subprocess.PIPE时,创建管道。
- shell:默认为False,则args需要列表形式,当为True时,在unix下执行命令相当于args前面添加了"/bin/sh" "-c"
- cwd:设置工作目录,表示在哪个路径下执行args命令。
使用如下:
查看当前目录下的文件:
import subprocess
str_cmd = "ls -a"
subprocess.Popen("ls -a", shell=True)
list_cmd = ["ls", "-a"]
subprocess.Popen(list_cmd )
Popen类对象的方法
- poll():检查是否结束,设置返回值。
- wait():等待命令执行完成,设置返回值。
- communicate():参数是标准输入,返回标准输出和标准出错。
- returncode:进程返回值
import subprocess
def cmd(cmd):
subp = subprocess.Popen(cmd,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
encoding="utf-8")
subp.wait(timeout=3) # 3秒内若cmd命令没执行完毕则抛出异常
if subp.poll() == 0: # 检查cmd命令是否完成
print(subp.communicate()[1]) # 获得执行cmd命令的输出值
else:
print("失败")
cmd("java -version")
cmd("exit 1")
可参考:https://www.runoob.com/w3cnote/python3-subprocess.html