subprocess 模块允许你生成新的进程,连接它们的输入、输出、错误管道,并且获取它们的返回码
1. 官方文档地址
https://docs.python.org/zh-cn/3.6/library/subprocess.html#module-subprocess
2. 主要的函数说明
Popen 是 subprocess的核心,子进程的创建和管理都靠它处理。
2.1 常用参数:
- args:shell命令,可以是字符串或者序列类型(如:list,元组)
- bufsize:缓冲区大小。当创建标准流的管道对象时使用,默认-1。
0:不使用缓冲区
1:表示行缓冲,仅当universal_newlines=True时可用,也就是文本模式
正数:表示缓冲区大小
负数:表示使用系统默认的缓冲区大小。 - stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄
- preexec_fn:只在 Unix 平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用
- shell:如果该参数为 True,将通过操作系统的 shell 执行指定的命令。
- cwd:用于设置子进程的当前目录。
- env:用于指定子进程的环境变量。如果 env = None,子进程的环境变量将从父进程中继承。
2.2 Popen 对象方法
- poll(): 检查进程是否终止,如果终止返回 returncode,否则返回 None。
- wait(timeout): 等待子进程终止。
- communicate(input,timeout): 和子进程交互,发送和读取数据。
- send_signal(singnal): 发送信号到子进程 。
- terminate(): 停止子进程,也就是发送SIGTERM信号到子进程。
- kill(): 杀死子进程。发送 SIGKILL 信号到子进程。
3. 实例代码
import uuid
import subprocess
class ProcessManager(object):
def __init__(self):
self.processes = {}
def __del__(self):
for process_uuid in self.processes:
self.processes[process_uuid].terminate()
def start_process(self, process_uuid, cmd_line):
proc = None
try:
proc = subprocess.Popen(cmd_line)
self.processes[process_uuid] = proc
except:
print("The command line failed: {}".format(cmd_line))
return None
return proc
def stop_process(self, process_uuid):
proc = self.processes[process_uuid]
del self.processes[process_uuid]
try:
proc.terminate()
except Exception as e:
print('stop process exception: {}'.format(e))
def list_ended_process(self):
ended_process = []
for process_uuid in self.processes:
if not self.is_running(process_uuid):
ended_process.append(process_uuid)
return ended_process
def is_running(self, process_uuid):
return self.processes[process_uuid].poll() is None
if __name__ == "__main__":
process_mgr = ProcessManager()
for id in list(range(5)):
process_mgr.start_process(process_uuid=uuid.uuid1(), cmd_line='cmd')
print('start process end')
4. 程序结果
启动五个控制台程序