subprocess 模块可以用于执行系统命令, 拿到执行的结果, 速度比较的快, 并且它允许你创建一个新的进程让其去执行另外的程序, 并与它进行通信,获取标准的输入、标准输出、标准错误以及返回码等

  • 先来一个正确执行命令
import subprocess

res = subprocess.Popen(
    "dir",                   # 在终端运行的命令
    shell=True,              # 新开一个终端
    stdout=subprocess.PIPE,  # 执行完命令, 将正确输出放到一个管道里
    stderr=subprocess.PIPE,  # 将错误输出放到一个管道里
)
result = res.stdout.read()   # 拿到的是 bytes 格式的字符
result= str(result,encoding="gbk")  # 在windows需要使用gbk编码,linux和mac上是"utf-8"

print(result)

执行正确结果如下

 驱动器 F 中的卷是 本地磁盘
 卷的序列号是 F2D8-4703

 F:\python_16\day 36 的目录

2021/01/18  12:01    <DIR>          .
2021/01/18  12:01    <DIR>          ..
2021/01/18  11:55               718 client.py
2021/01/18  12:01               498 project.py
2021/01/18  11:20             1,147 sever.py
2021/01/18  10:16               154 struct模块应用.py
2021/01/18  10:16               573 客户端.py
2021/01/18  10:16             1,005 服务端.py
               6 个文件          4,095 字节
               2 个目录 344,722,980,864 可用字节

那如果你输入的命令不存在, stdout 改成 stderr

import subprocess

res = subprocess.Popen(
    "aaa",                   # 在终端运行的命令
    shell=True,              # 新开一个终端
    stdout=subprocess.PIPE,  # 执行完命令, 将正确输出放到一个管道里
    stderr=subprocess.PIPE,  # 将错误输出放到一个管道里
)
result = res.stderr.read()   # 拿到的是 bytes 格式的字符
result= str(result,encoding="gbk")  # 在windows需要使用gbk编码

print(result)

执行错误结果如下:

'aaa' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
  • 通过 | 管道符号可以实现将第一个命令的结果传递给第二个命令使用
import subprocess

res1 = subprocess.Popen( 
    "dir | findstr html*",  # 使用管道符号运行命令
    shell=True,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
)

result = res1.stdout.read()
result= str(result,encoding="gbk")
print(result)

 

posted on 2022-06-29 14:57  司徒轩宇  阅读(193)  评论(0编辑  收藏  举报