打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
python内置模块subprocess 模块,创建和管理子进程

一、简介

subprocess 是 Python 标准库中的一个模块,用于创建和管理子进程。它提供了一种在 Python 程序中启动新进程、连接到它们的输入/输出/错误管道以及获取它们的返回值的方法。

使用 subprocess 模块,你可以在 Python 程序中执行外部命令、调用其他可执行文件,并与它们进行交互。这使得你可以利用 Python 的强大功能来自动化和控制其他程序的执行。

二、subprocess.Popen 函数,启动一个新的子进程并与其进行交互

  1. popen = subprocess.Popen(args,...,process_group=None):创建popen对象
  • args:要执行的命令,可以是一个字符串或一个字符串列表。如果是字符串列表,则每个元素都将作为一个单独的参数传递给命令。
  • bufsize:用于指定缓冲区的大小。默认值为 -1,表示使用系统默认的缓冲区大小。
  • executable:用于指定要执行的可执行文件的路径。默认为 None,表示使用系统默认的可执行文件查找规则。
  • stdin、stdout、stderr:这些参数用于指定子进程的标准输入、标准输出和标准错误的管道。它们可以是文件对象、文件描述符或 subprocess.PIPE(用于创建一个新的管道)。
  • preexec_fn:一个可调用对象,在子进程执行前被调用。它可以用于设置子进程的环境、文件描述符等。
  • close_fds:一个布尔值,用于指定是否在子进程中关闭不需要的文件描述符。默认为 True,表示关闭不需要的文件描述符。
  • shell:一个布尔值,用于指定是否通过系统的 shell 来执行命令。默认为 False,表示直接执行命令而不使用 shell。
  • cwd:用于指定子进程的当前工作目录。
  • env:一个字典,用于指定子进程的环境变量。默认为 None,表示继承当前进程的环境变量。
  • universal_newlines:一个布尔值,用于指定是否将输入/输出数据作为文本处理,并使用通用换行符模式。默认为 None,表示根据系统平台自动选择是否以文本模式处理。
  • startupinfo:一个 subprocess.STARTUPINFO 对象,用于指定子进程的启动信息。
  • creationflags:一个整数,用于指定创建子进程的标志。默认为 0,表示使用默认标志。
  • restore_signals:一个布尔值,用于指定是否在子进程中恢复信号处理程序。默认为 True,表示恢复信号处理程序。
  • start_new_session:一个布尔值,用于指定是否在子进程中启动新的会话。默认为 False,表示不启动新的会话。
  • pass_fds:一个整数列表,用于指定在子进程中保持打开状态的文件描述符。
  • encoding、errors、text:这些参数用于指定文本数据的编码和错误处理方式。它们在 Python 3 中引入,用于替代 universal_newlines 参数。
  • umask:一个整数,用于指定子进程的文件模式创建掩码。默认为 -1,表示使用当前进程的掩码。
  • pipesize:一个整数,用于指定管道的大小。默认为 -1,表示使用系统默认的管道大小。
  • process_group:一个整数,用于指定子进程的进程组 ID。
  1. popen.poll():用于检查子进程(命令)是否已经执行结束,没结束返回None,结束后返回状态码。
  2. popen.wait(timeout=None):等待子进程结束,并返回状态码;如果在timeout指定的秒数之后进程还没有结束,将会抛出一个TimeoutExpired异常。
  3. popen.communicate(input=None, timeout=None):该方法可用来与进程进行交互,比如发送数据到stdin,从stdout和stderr读取数据,直到到达文件末尾。
  4. popen.send_signal(signal):发送指定的信号给这个子进程。
  5. popen.terminate():停止该子进程。
  6. popen.kill():杀死该子进程。
  7. popen.stdin:如果在创建Popen对象时参数stdin被设置为PIPE,Popen.stdin将返回一个文件对象用于策子进程发送指令。否则返回None。
  8. popen.stdout:如果在创建Popen对象时参数stdout被设置为PIPE,Popen.stdout将返回一个文件对象用于策子进程发送指令。否则返回None。
  9. popen.stderr:如果在创建Popen对象时参数stdout被设置为PIPE,Popen.stdout将返回一个文件对象用于策子进程发送指令。否则返回None。
  10. popen.pid:获取子进程的进程ID。
  11. popen.returncode:获取进程的返回值。如果进程还没有结束,返回None。
  12. popen.args:获取传递给 Popen 的命令参数。
  13. popen.universal_newlines:布尔值,表示是否以文本模式处理输入/输出数据,并使用通用换行符模式。如果在创建 Popen 对象时指定了 universal_newlines=True,则 popen.universal_newlines 将为 True。

三、subprocess模块中的常用函数,都是基于subprocess.Popen实现

  1. subprocess.run(*popenargs, input=None, capture_output=False, timeout=None, check=False, **kwargs):执行指定的命令,等待命令完成,并返回一个 CompletedProcess 对象,其中包含有关命令执行的信息,如返回码、标准输出和标准错误输出。
  • popenargs:要执行的命令及其参数,可以是一个字符串或一个字符串列表。
  • input:用于向子进程发送的输入。它可以是一个字节字符串。
  • capture_output:一个布尔值,用于指定是否捕获子进程的标准输出和标准错误输出。
  • timeout:一个可选的超时时间,用于指定等待命令完成的最长时间。
  • check:一个布尔值,用于指定是否检查命令的返回码,并在返回码非零时引发异常。
  • **kwargs:其他关键字参数,用于传递给 subprocess.Popen 构造函数。
  1. subprocess.call(*popenargs, timeout=None, **kwargs):执行指定的命令,等待命令完成,并返回命令的返回码。
  • popenargs:要执行的命令及其参数,可以是一个字符串或一个字符串列表。
  • timeout:一个可选的超时时间,用于指定等待命令完成的最长时间。
  • **kwargs:其他关键字参数,用于传递给 subprocess.Popen 构造函数。
  1. subprocess.check_call(*popenargs, **kwargs):执行指定的命令,等待命令完成。如果命令的返回码非零,则引发 CalledProcessError 异常。
  • popenargs:要执行的命令及其参数,可以是一个字符串或一个字符串列表。
  • **kwargs:其他关键字参数,用于传递给 subprocess.Popen 构造函数。
  1. subprocess.check_output(*popenargs, timeout=None, **kwargs):执行指定的命令,等待命令完成,并返回命令的输出结果。
  • popenargs:要执行的命令及其参数,可以是一个字符串或一个字符串列表。
  • timeout:一个可选的超时时间,用于指定等待命令完成的最长时间。
  • **kwargs:其他关键字参数,用于传递给 subprocess.Popen 构造函数。
  1. subprocess.getoutput(cmd, *, encoding=None, errors=None):执行指定的命令,并返回命令的输出结果作为一个字符串。
  • cmd:要执行的命令。
  • encoding:用于解码命令输出的字符编码。
  • errors:用于指定解码命令输出时的错误处理方式。
  • subprocess.getoutput() 函数
  1. subprocess.getstatusoutput(cmd, *, encoding=None, errors=None):执行指定的命令,并返回一个元组,包含命令的返回码和输出结果。
  • cmd:要执行的命令。
  • encoding:用于解码命令输出的字符编码。
  • errors:用于指定解码命令输出时的错误处理方式。
  1. subprocess.list2cmdline(seq):将字符串序列转换为一个单独的字符串,用于表示命令行参数。它使用与操作系统相关的规则来转义和引用参数。
  • seq:一个字符串序列。

四、解决输入输出报编码错误的bug

import subprocessfrom functools import partialsubprocess.Popen = partial(subprocess.Popen,encoding='utf-8')
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
python学习 subprocess模块
Python模块学习
python子进程模块subprocess详解与应用实例 之一
Python 常用模块大全(整理)
subprocess模块学习
Python脚本执行shell的一个小问题
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服