介绍subprocess之前,需要先了解一下os.system与os.popen两个方法
os.system
在python脚本中运行运行shell命令
举例
import os
os.system("ls -al")
将上面的代码保存名为script.py的python文件
然后在命令行中执行:
~ python script.py
就好像直接在命令行中执行“ ls -al”
os.popen
运行shell命令并与其输入输出相连接,os.system将命令的结果直接输出,os.popen可以通过一个变量接受命令输出
res = os.popen("ls -al")
# res.readline(), res.readlines()
print(res.read())
subprocess模块
subprocess模块可以实现与os.system与os.popen相同的功能,但是能更好的控制输入输出流
subprocess.run
(args, input, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None)
执行一个命令,并返回执行结果
主要参数说明:
参数名 | 含义 |
args | 由执行命令与命令行参数组成的元组 |
input | 输入,字节类型,指定了encoding可以使用字符串 |
stdin | 输入流,如果传递了input,就不能指定stdin |
stdout | 输出流 |
stderr | 错误流 |
shell | 使用shell执行命令,windows下需要shell=True,否则不能执行 |
encoding | 编码 |
text | universal_newlines别名,文本模式 |
timeout | 如果子进程超时,将杀死子进程 |
env | 字典类型,shell环境变量 |
subprocess.run举例
with open("mydata.txt", "w") as f:
subprocess.run(("ls", "-al"), stdout=f)
运行之后,“ls -al"结果输出到mydata.txt文件中
subprocess.Popen(
['args', 'bufsize=-1', 'executable=None', 'stdin=None', 'stdout=None', 'stderr=None', 'preexec_fn=None', 'close_fds=True', 'shell=False', 'cwd=None', 'env=None', 'universal_newlines=None', 'startupinfo=None', 'creationflags=0', 'restore_signals=True', 'start_new_session=False', 'pass_fds=()', '*', 'encoding=None', 'errors=None', 'text=None'],
)
实际上subprocess.run内部调用了subprocess.Popen,也就是Popen方法更加底层一点
subprocess.CompletedProcess
subprocess.run执行后返回的对象
CompletedProcess属性
属性名 | 说明 |
args | 对应run的args参数 |
returncode | 子进程执行状态,执行成功等于0 |
subprocess提供的旧接口
call(...) |
执行命令,并返回执行状态 |
check_call(...) |
与call一样,但是如果返回的执行状态不等于0, 那么返回CalledProcessError() |
check_output(...) |
与check_call() 相同,但是返回错误内容 |
getoutput(...) |
执行命令返回输出 |
getstatusoutput(...) |
执行命令,并返回一个由(exitcode, output) 组成的元组 |
讨论区