python 中 使用 subprocess 写出 ProcessManager

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. 程序结果

启动五个控制台程序

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值