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
>>>
参考
本文来自博客园,作者:whilewell,转载请注明原文链接:https://www.cnblogs.com/viiv/p/15664717.html