21.subprocess模块

subprocess模块

1). 概述

  1. 系统命令调用模块
  2. 导入方式
import subprocess

2). run()方法

  1. 官方推荐的执行方法:同步方法
  2. 与之还有一个call方法,使用较少
  3. 执行案例
a = subprocess.run(["df","-h"], stderr = subprocess.PIPE, 
                    stdout = subprocess.PIPE, check=True)
  1. 签名解释

    • ["df","-h"]命令参数,开启一个进程
    • stderr = subprocess.PIPE 如果报错,通过管道接受程序执行的错误信息 (命令参数就不能写管道符号)
    • stdout = subprocess.PIPE 通过管道接受程序执行结果 (命令参数就不能写管道符号)
    • check = True 如果程序执行出现错误,返回一个非0值,解释器就报错
  2. 其他方式

a = subprocess.run("df -h | grep disk1",stderr = subprocess.PIPE,
                    stdout = subprocess.PIPE,check=True,shell = True)

加一个shell = True,命令行参数不用列表的形式,直接写shell下执行的格式,就是直接将内容交给shell,不通过解释器进行拼接

3). Popen()方法

  1. Popen 将run与call进行封装:异步方法
  2. 使用案例
a = subprocess.Popen(
    "sleep 2",
    shell = True, 
    cwd="/temp",
    stdout = subprocess.PIPE,
    preexec_fn=sayhi)
    
a.stdout.read()
  1. 参数解释
    • args:shell命令,可以是字符串或者序列类型(如:list,元组)
    • shell:同上
    • stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄
    • preexec_fn:只在Unix平台下有效,用于指定一个可执行对象(callable object,比如函数的名字),它将在子进程运行之前被调用
    • cwd:用于设置子进程的当前目录
    • env:用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。
  1. Popen调用后会返回一个对象,假设为a对象,有如下API
    • a.poll():Check if child process has terminated. Returns returncode
    • a.wait():Wait for child process to terminate. Returns returncode attribute.
    • a.terminate():终止所启动的进程 (不会强制终止,只是发一个终止信号)
    • a.kill():杀死所启动的进程,强制终止
    • a.communicate(b'22'):与启动的进程交互,发送数据到stdin,并从stdout接收输出,然后等待任务结束
    • a.send_signal(signal.xxx):发送系统信号
    • a.pid:拿到所启动进程的进程号

你可能感兴趣的:(21.subprocess模块)