【python】内置模块-subprocess-开启进程并管理

it2023-05-29  72

文章目录

简介runPopen

简介

subprocess模块允许你开启新的进程,并连接到他们的输入/输出/错误管道,从而获取返回值。官方文档:https://www.runoob.com/w3cnote/python3-subprocess.html推荐使用run()方法,更高级的用法可以直接实用popen接口

run

语法:subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None)

选项说明 选项说明args要执行的命令stdin/stdout/stderr子进程的标准输入,输出和错误。值可以为subprocess.PIPE(表示为子进程创建新的管道)、subprocess.DEVNULL(表示使用 os.devnull)、一个已经存在的文件描述符、已经打开的文件对象或者 None。默认为None,表示什么都不做。另外,stderr 可以合并到 stdout 里一起输出。timeout设置命令超时时间,如果命令执行超时,子进程将会被杀死,并弹出TimeoutExpired 异常check如果该参数设置为 True,并且进程退出状态码不是 0,则弹 出 CalledProcessError 异常encoding如果指定了该参数,则 stdin、stdout 和 stderr 可以接收字符串数据,并以该编码方式编码。否则只接收 bytes 类型的数据。shell如果该参数为 True,将通过操作系统的 shell 执行指定的命令cmd启动子进程的命令capture_output格式化输出env用于指定子进程的环境变量。如果 env = None,子进程的环境变量将从父进程中继承 结果说明:返回CompletedProcess实例,其中returncode代表执行完子进程的状态,通常返回0代表已经运行完毕,若为负值代表子进程被终止示例import subprocess def runcmd(command): ret = subprocess.run(command,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding="utf-8",timeout=1) if ret.returncode == 0: print("success:",ret) else: print("error:",ret) runcmd(["dir","/b"])#序列参数 runcmd("exit 1")#字符串参数 返回值如下:success: CompletedProcess(args=['dir', '/b'], returncode=0, stdout='test.py\n', stderr='') error: CompletedProcess(args='exit 1', returncode=1, stdout='', stderr='')

Popen

Popen 是 subprocess的核心,子进程的创建和管理都靠它处理 语法:class subprocess.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=False,startupinfo=None,creationflags=0,restore_signals=True,start_new_session=False, pass_fds=(),*, encoding=None, errors=None)

选项说明 选项说明bufsize缓冲区大小。当创建标准流的管道对象时使用,默认-1。0代表不使用缓冲区,1表示行缓冲,仅当universal_newlines=True时可用,也就是文本模式,正数表示缓冲区大小,负数:表示使用系统默认的缓冲区大小preexec_fn只在 Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用其余的选项与run的选项及说明相同 popen对象方法说明 方法说明poll()检查进程是否终止,如果终止返回 returncode,否则返回 Nonewait(timeout)等待子进程终止communicate(input,timeout)和子进程交互,发送和读取数据send_signal(singnal)发送信号到子进程terminate()停止子进程,也就是发送SIGTERM信号到子进程kill()杀死子进程,发送 SIGKILL 信号到子进程 示例import time import subprocess def cmd(command): subp = subprocess.Popen(command,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding="utf-8") subp.wait(2) if subp.poll() == 0: print(subp.communicate()[1]) else: print("失败") cmd("python -version") cmd("exit 1") 结果如下:Python 3.6.5 失败
最新回复(0)