有趣的Python笔记Ⅴ_Subprocess

Subprocess

目录

[TOC]

简介

subprocess 模块允许你生成新的进程,连接它们的输入、输出、错误管道,并且获取它们的返回码。此模块代替一些老旧的模块与功能:

1
2
3
os.system
os.spawn*
os.popen*

主要有run()Popen()两个API:

run(...): Runs a command, waits for it to complete, then returns a CompletedProcess instance. Popen(...): A class for flexibly executing a command in a new process

一般推荐使用subprocess.run(),更底层的调用来自subprocess.Popen()

Constants: DEVNULL: Special value that indicates that os.devnull should be used PIPE: Special value that indicates a pipe should be created STDOUT: Special value that indicates that stderr should go to stdout

class Popen(builtins.object): Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, encoding=None, errors=None, text=None)

具体的参数请见下面的内容。

PIPE(管道)

管道(PIPE)是两个不同进程(process)通过内核(kernal)通信的方式

不同进程有不同的内存地址,因此自身内部的全局变量无法被其他进程读取。为解决通信问题,两个进程通过内核缓冲区建立联系:

PIPE

创建过程

  1. 父进程创建管道,得到管道fd[0]读端fd[1]写端
  2. 父进程fork出子进程;
  3. 父进程关闭读端,子进程关闭写端(管道是单向的)
管道通信

Run()