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,注意二者区别。