subprocess.Popen()的简单用法
subprocess 模块允许你生成新的进程,连接它们的输入、输出、错误管道,并且获取它们的返回码。
subprocess.Popen(args, shell=True, stderr=subprocess.PIPE, stdin=subprocess.PIPE,stdout=subprocess.PIPE)
args
被用作启动进程的参数. 可能是一个列表或字符串.
shell
(默认为 False)指定是否使用 shell 执行程序。如果 shell 为 True,更推荐将 args 作为字符串传递而非序列。
stdout
从子进程捕获到的标准输出. 一个字节序列, 或一个字符串, 如果 run() 是设置了 encoding, errors 或者 text=True 来运行的. 如果未有捕获, 则为 None.
如果你通过 stderr=subprocess.STDOUT 运行, 标准输入和标准错误将被组合在一起, 并且 stderr` 将为 None.
stderr
捕获到的子进程的标准错误. 一个字节序列, 或者一个字符串, 如果 run() 是设置了参数 encoding, errors 或者 text=True 运行的. 如果未有捕获, 则为 None.
简而言之
上面代码简而言之就是,接受args的命令,执行成功就将执行成功的结果存入stdout管道,执行失败的结果存入stderr管道。
import subprocess
args1='ipconfig'
res1=subprocess.Popen(args1,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
print('stdout:%s type of res:%s\n' %(res1.stdout.read().decode('gbk'),type(res1)))
args2='ssss'
res2=subprocess.Popen(args2,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
print('stderr:%s type of res:%s' %(res2.stderr.read().decode('gbk'),type(res2)))
# stdout:
# Windows IP 配置
#
#
# 以太网适配器 SSTAP 1:
#
# 媒体状态 . . . . . . . . . . . . : 媒体已断开连接
# 连接特定的 DNS 后缀 . . . . . . . :
#
# 以太网适配器 以太网:
#
# 媒体状态 . . . . . . . . . . . . : 媒体已断开连接
# 连接特定的 DNS 后缀 . . . . . . . :
#
# 无线局域网适配器 本地连接* 8:
#
# 媒体状态 . . . . . . . . . . . . : 媒体已断开连接
# 连接特定的 DNS 后缀 . . . . . . . :
#
# 无线局域网适配器 本地连接* 10:
#
# 媒体状态 . . . . . . . . . . . . : 媒体已断开连接
# 连接特定的 DNS 后缀 . . . . . . . :
#
# 无线局域网适配器 本地连接* 13:
#
# 媒体状态 . . . . . . . . . . . . : 媒体已断开连接
# 连接特定的 DNS 后缀 . . . . . . . :
#
# 无线局域网适配器 WLAN:
#
# 连接特定的 DNS 后缀 . . . . . . . :
# 本地链接 IPv6 地址. . . . . . . . : fe80::f0e4:b513:4d38:8aff%8
# IPv4 地址 . . . . . . . . . . . . : 10.128.74.15
# 子网掩码 . . . . . . . . . . . . : 255.255.128.0
# 默认网关. . . . . . . . . . . . . : 10.128.0.1
# type of res:<class 'subprocess.Popen'>
#
# stderr:'ssss' 不是内部或外部命令,也不是可运行的程序
# 或批处理文件。
# type of res:<class 'subprocess.Popen'>
该模块还有更多功能,此功能知识其中的一小部分,主要用于返回cmd执行命令返回的结果,返回的结果是bytes字节,通过read对管道内容进行读取,读取的内容是bytes字节,所以需要使用decode进行解码,windows系统编码是gbk,linux系统是utf-8,注意二者区别。
更多功能请参考:[subprocess.Popen更多用法](https://docs.python.org/zh-cn/3/library/subprocess.html)