请稍候,加载中....

subprocess模块

介绍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, inputstdin=Noneinput=Nonestdout=Nonestderr=Nonecapture_output=Falseshell=Falsecwd=Nonetimeout=Nonecheck=Falseencoding=Noneerrors=Nonetext=Noneenv=Noneuniversal_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) 组成的元组

 


Python学习手册-