python模块之——subprocess

前言:os.system也可以执行系统命令,但是它会直接在主进程中去执行命令,如果该命令执行需要耗费很长时间,那么主进程就会一直卡着,导致效率低下。而subprocess模块在执行命令时,会开辟出一个一个子进程去执行命令,由于进程之间的内存空间是独立的,所以在subprocess模块中有个管道的概念,可以将执行命令的结果输出到管道,该管道就相当于一块共享的内存空=空间,可以让主进程去获取该共享空间存放的数据。

import subprocess 
# 创建一个子进程去执行系统命令
obj=subprocess.Popen(
  'ps -ef',    # 执行的系统命令(必须是字符串格式)
  shell=True,   # 指定命令解释器来解释执行的这条命令
  stdout=subprocess.PIPE, # 将执行的正确结果丢到管道(共享内存空间,用于进程之间共享)
  stderr=subprocess.PIPE # 将执行的错误结果丢到另一个新的管道
)
 
'''
当从任意一个管道,例如正确或者错误结果管道中获取值,
'''
 
# 从正确管道中获取值
res=obj.stdout.read() # 主进程去管道里获取正确的结果
print(res.decode('utf-8')) # 获取的结果是bytes类型,需要指定decode指定编码
 
# 从错误管道中获取值
res2=obj.stderr.read()
print(res2.decode('utf-8'))

替换之前的旧模块

  • os.system(cmd)
    执行系统命令,返回命令执行的退出状态码,0或非0

  • os.popen(cmd)
    返回脚本执行后的输出内容

基本用法

  • subprocess.run(args,。。。)
    args默认为一个字符串序列,如[‘df’,‘-h’],也可以使用’df -h’,但此时需要指定shell=True。
    注意:shell=True参数会让subprocess.call接受字符串类型的变量作为命令, 并调用shell去执行这个字符串, 当shell=False时, subprocess.call只接受数组变量作为命令, 并将数组的第一个元素作为命令, 剩下的全部作为该命令的参数。官方不推荐使用shell=True。
  • subprocess.call()
    返回命令的执行结果,0或非0
  • subprocess.getstatusoutput()
    接收字符串形式的命令,返回一个元祖形式的结果,第一个元素为命令执行状态,第二个元素为执行结果
  • subprocess.getoutput()
    接收字符串形式的命令,返回执行结果
  • subprocess.popen()
    上述所示命令均为该命令的封装
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页