有趣的Python笔记Ⅴ_Subprocess
Subprocess
目录
[TOC]
简介
subprocess
模块允许你生成新的进程,连接它们的输入、输出、错误管道,并且获取它们的返回码。此模块代替一些老旧的模块与功能:
1 | os.system |
主要有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)通信的方式。
不同进程有不同的内存地址,因此自身内部的全局变量无法被其他进程读取。为解决通信问题,两个进程通过内核缓冲区建立联系:
创建过程
- 父进程创建管道,得到管道
fd[0]读端
、fd[1]写端
; - 父进程
fork
出子进程; - 父进程关闭读端,子进程关闭写端(管道是单向的)。