当前位置: 首页 > news >正文

python subprocess库

subprocess

subprocess 是 Python 标准库中的一个模块,用于创建和管理子进程。它允许你在 Python 程序中执行外部命令、调用其他程序,并与这些程序进行交互。subprocess 模块提供了丰富的功能,可以替代一些旧的模块和函数,如 os.system()、os.spawn*()、os.popen() 等。

主要功能

* 执行外部命令:subprocess 可以启动一个新的进程来执行外部命令。
* 与子进程交互:你可以通过 subprocess 与子进程的标准输入、输出和错误流进行交互。
* 获取命令的输出:你可以捕获子进程的输出,并在 Python 程序中使用。
* 控制子进程:你可以等待子进程完成、检查其返回码,甚至终止子进程。

常见函数

  1. subprocess.run():
    这是subprocess模块中最常用的函数之一。它用于运行一个命令,并等待其完成,返回一个CompletedProcess对象,包含命令的执行结果。
  • 核心参数
    • args(必需参数)
      类型:str 或 序列(如 list)
      作用:指定要执行的命令
    • shell
      类型:bool
      默认:Flase
      作用:是否通过系统shell执行命令
      注意:
      • Ture时可直接使用管道符等特性
      • 存在安全风险(避免拼接用户输入)
subprocess.run(["ls",  "-l"])      # 推荐方式(安全)
subprocess.run("ls  -l", shell=True) # 字符串形式需配合 shell=True
  • 输入输出流控制
    • stdout/stdin/stdeer
      类型:文件描述符或subprocess.PIPE/DEVNULL
      特殊值:
      • subprocess.PIPE # 捕获输出
      • subprocess.DEVNULL # 丢弃输出
      • subprocess.STDOUT # 将 stderr 合并到 stdout
    • capture_output
      类型:bool
      默认:Flase
      简写:stdout=subprocess.PIPE, stderr=subprocess.PIPE
      * capture_output=True 等效于同时设置
      stdout=subprocess.PIPE
      stderr=subprocess.PIPE
    • text/universal_newlines
      类型:bool
      默认: Flase
      作用:是否以字符串形式返回输出(默认返回字节)
  • 执行控制
    • check
      类型:bool
      默认:Flase
      作用:当返回码非零时抛出CalledProcessError
    • timeout
      类型:int/float
      作用:设置命令超时时间(秒)
      异常:触发TimeoutExpired
    • input
      类型:bytes/str
      作用:向子进程的标准输入发送数据
      要求:需配合stdin=subprocess.PIEP
  • 环境控制
    • cwd
      类型:str/Path
      作用:设置命令执行工作目录
      示例:subprocess.run(["git", "status"], cwd="/project/path")
    • env
      类型:dict
      作用:自定义环境变量
      注意:默认继承当前环境,建议使用os.environ.copy()
  1. subprocess.Popen():
  • 核心定位
    • 这是一个更底层的接口,提供了更多的灵活性。你可以使用它来启动一个子进程,并与其进行复杂的交互。subprocess.Popen 是 Python 子进程管理的底层接口,相比 subprocess.run() 提供更细粒度的控制,适用于以下场景:
      • 实时流处理(如逐行读取日志)
      • 交互式命令(如自动化 SSH 会话)
      • 后台进程管理(如启动守护进程)
      • 复杂 I/O 管道(如多进程协作)
  1. subprocess.call():
  • 功能概述
    作用:执行命令并等待其完成,返回命令的 退出状态码(0 表示成功,非 0 表示失败)13。
    典型场景:简单执行命令且不关心输出内容,只需判断是否成功。
    核心参数
    • 核心参数
      • args
        类型/默认值:str 或 list
        说明:要执行的命令(推荐列表形式)示例:call(["ls", "-l"]) 或 call("ls -l", shell=True)
      • shell
        类型/默认值:bool (False)
        说明:是否通过系统 shell 执行(支持管道符等特性,但有安全风险)
      • stdout
        类型/默认值:文件描述符
        说明:控制标准输出(默认输出到终端,可用 subprocess.DEVNULL 丢弃输出)
      • stderr
        类型/默认值:文件描述符
        说明:控制标准错误(默认输出到终端)
import subprocess 
 
# 执行命令并检查状态码 
return_code = subprocess.call(["gcc",  "main.c"])
if return_code == 0:
    print("编译成功")
else:
    print("编译失败,错误码:", return_code)
  1. subprocess.check_output():
    • 功能概述
      作用:执行命令并 捕获标准输出内容(不捕获错误输出),若命令失败则抛出 CalledProcessError 异常
      典型场景:需要获取命令输出内容,且要求命令必须成功执行。
    • 核心参数
      • args
        类型/默认值:str 或 list
        说明:同 call()
      • shell
        类型/默认值:bool (False)
        说明:同 call()
      • stdeer
        类型/默认值:文件描述符
        说明:默认错误输出到终端,可设为 subprocess.STDOUT 合并到 stdout
      • universal_newlines
        类型/默认值:bool (False)
        说明:返回字符串形式
      • encoding
        类型:str
        说明:指定输出编码(需配合 text=True 使用)
import subprocess 
 
try:
    output = subprocess.check_output( 
        ["python", "script.py"], 
        stderr=subprocess.STDOUT,  # 合并错误到输出 
        text=True                  # 返回字符串而非字节 
    )
    print("输出结果:", output)
except subprocess.CalledProcessError as e:
    print("执行失败,错误信息:", e.output) 

相关文章:

  • 阿里云上的网站配置HTTPS
  • Ansys EMC Plus:HIRF 与飞机耦合演示
  • qsort介绍与实现
  • 【Python 学习 / 7】模块与文件操作
  • 一键部署开源DeepSeek并集成到钉钉
  • Python常见面试题的详解14
  • 为什么推荐B端做谷歌SEM?
  • Cursor实战:Web版背单词应用开发演示
  • 光学精密测量文献记录
  • Linux 多Python版本统一和 PySpark 依赖 python 包方案
  • 每日学习Java之一万个为什么
  • 论文笔记-WSDM2024-LLMRec
  • 【核心算法篇十三】《DeepSeek自监督学习:图像补全预训练方案》
  • leetcode_位运算 67.二进制求和
  • 关于 BK3633 上电时受串口 UART2 影响而无法启动的问题说明
  • 开发一个交易所需要哪些技术
  • 分布式之分布式ID
  • C语言(21)
  • 掌握 ElasticSearch的 _source 过滤
  • LLM 学习2
  • 武汉建设工程律师/优化网站最好的刷排名软件
  • 武汉专业建站网/微软bing搜索引擎
  • 六十岁一级a做爰片免费网站/百度seo怎么做网站内容优化
  • 嘉兴做网站优化公司/免费seo推广公司
  • 如何做优秀的视频网站设计/网站制作详细流程
  • 申请个网站要多少钱/青岛网络科技公司排名