Python3--subprocess

概述

subprocess 模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。
这个模块用来创建和管理子进程。它提供了高层次的接口,用来替换os.system()、 os.spawn()、 os.popen()、os,popen2.()和commands.*等模块和函数。
subprocess提供了一个名为Popen的类启动和设置子进程的参数,由于这个类比较复杂, subprocess还提供了若干便利的函数,这些函数都是对Popen类的封装

应用场景:

  • 创建子进程执行命令:习惯linux对此都很熟悉

实例

python3推荐使用run, 遍历网上的写法,都太过复杂。下面的实例可以直接拿来使用,等同于linux下面执行命令, 可以满足常见的基本需求。

应用范围:

  • 没有交互输入的场景
  • 关注执行结果
  • 日志输出到stdout和stderr

入参说明:

  • run_dir: 命令执行的路径
  • cmd:命令行,支持管道、重定向操作。e.g. make -j8 2>&1 | tee log
  • chk: bool类型,True:执行失败后会触发python异常退出。False:执行结果不会影响python的执行
import os
import subprocess

def run_cmd(run_dir, cmd, chk=True):
  if not os.path.exists(run_dir):
     return
  r = subprocess.run(cmd, cwd=run_dir, stdin=None, input=None, stdout=sys.stdout, stderr=sys.stderr, shell=True, check=chk, encoding="utf-8")
  if r.returncode != 0
    return False
  return True

举例

subprocess.run执行后会返回一个CompletedProcess对象,该对象中存放了执行的信息和结果,可以通过返回值来判断执行结果

正常执行:check=False

>>> import sys
>>> import subprocess
>>> a = subprocess.run("ls -la", cwd=".", stdin=None, input=None, stdout=sys.stdout, stderr=sys.stderr, shell=True, check=False, encoding="utf-8")
total 68
drwxrwxr-x 3 wsk wsk  4096 Nov 27 11:37 .
drwxrwxr-x 6 wsk wsk  4096 Nov 27 11:37 ..
-rw-rw-r-- 1 wsk wsk  1641 Nov 27 11:37 BSD-2-Clause
-rw-rw-r-- 1 wsk wsk  1845 Nov 27 11:37 BSD-3-Clause
drwxrwxr-x 2 wsk wsk  4096 Nov 27 11:37 .git
-rw-rw-r-- 1 wsk wsk 13073 Nov 27 11:37 GPL-1.0
-rw-rw-r-- 1 wsk wsk 18644 Nov 27 11:37 GPL-2.0
-rw-rw-r-- 1 wsk wsk  1046 Nov 27 11:37 ISC
-rw-rw-r-- 1 wsk wsk  1276 Nov 27 11:37 Linux-syscall-note
-rw-rw-r-- 1 wsk wsk  1372 Nov 27 11:37 MIT
>>> a
CompletedProcess(args='ls -la', returncode=0)
>>>

异常执行:check=False

该异常不会中断python的执行,a对象正常被创建

>>> a = subprocess.run("ls -T", cwd=".", stdin=None, input=None, stdout=sys.stdout, stderr=sys.stderr, shell=True, check=False, encoding="utf-8")
ls: option requires an argument -- 'T'
Try 'ls --help' for more information.
>>> a
CompletedProcess(args='ls -T', returncode=2)

异常执行:check=True

该异常会中断python的执行,c对象并没有被创建

>>> c = subprocess.run("ls -T", cwd=".", stdin=None, input=None, stdout=sys.stdout, stderr=sys.stderr, shell=True, check=True, encoding="utf-8")
ls: option requires an argument -- 'T'
Try 'ls --help' for more information.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.6/subprocess.py", line 438, in run
    output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command 'ls -T' returned non-zero exit status 2.
>>> c
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'c' is not defined
>>>

参考

posted @ 2021-12-08 22:17  whilewell  阅读(399)  评论(0编辑  收藏  举报