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

subprocess.check_output和stdout有什么不同 还有run和popen

subprocess 模块提供了多种方法来运行外部命令,并且可以捕获标准输出、标准错误等。以下是 subprocess.check_outputstdout 参数、subprocess.runsubprocess.Popen 的区别和用途:

1. subprocess.check_output

  • 用途:运行命令并捕获标准输出(stdout)的输出。

  • 行为

    • 如果命令成功(退出码为 0),它会返回标准输出的内容。

    • 如果命令失败(退出码非 0),它会抛出一个 subprocess.CalledProcessError 异常。

  • 优点

    • 简单易用,直接返回输出内容。

    • 异常处理,方便调试。

  • 示例

    try:output = subprocess.check_output(["echo", "Hello, World!"])print(output.decode())  # 输出为 bytes,需要解码
    except subprocess.CalledProcessError as e:print(f"Error: {e}")

2. stdout 参数

  • 用途

    • 用于指定 subprocess 中标准输出的去向。

    • 可以设置为:

      • subprocess.PIPE:将输出捕获到管道中。

      • subprocess.DEVNULL:丢弃输出。

      • sys.stdout:将输出直接打印到控制台。

  • 行为

    • 结合 subprocess.runsubprocess.Popen 使用。

    • 默认情况下,stdout 会打印到控制台。

  • 示例

    result = subprocess.run(["echo", "Hello, World!"], stdout=subprocess.PIPE, text=True)
    print(result.stdout)  # 捕获标准输出

3. subprocess.run

  • 用途:运行命令并等待其完成。

  • 行为

    • 返回一个 subprocess.CompletedProcess 对象。

    • 默认情况下,标准输出和标准错误会打印到控制台。

    • 可以通过参数(如 stdoutstderrcapture_output 等)控制输出和错误的处理。

  • 优点

    • 简洁且功能强大。

    • 可以控制命令的执行方式。

  • 示例

    # 默认输出到控制台
    subprocess.run(["echo", "Hello, World!"])# 捕获输出
    result = subprocess.run(["echo", "Hello, World!"], stdout=subprocess.PIPE, text=True)
    print(result.stdout)

4. subprocess.Popen

  • 用途:创建一个子进程并与其交互。

  • 行为

    • subprocess 模块的底层实现,提供了更多灵活性。

    • 可以通过管道与子进程进行交互(例如 stdinstdoutstderr)。

    • 需要手动调用 .wait() 等待子进程结束。

  • 优点

    • 灵活性高,适合复杂的交互场景。

    • 可以动态地与子进程交互。

  • 示例

    # 创建子进程
    process = subprocess.Popen(["echo", "Hello, World!"], stdout=subprocess.PIPE, text=True)# 与子进程交互
    output = process.communicate()[0]
    print(output)# 等待子进程结束
    process.wait()

总结对比

方法输出捕获异常处理返回类型灵活性用途
subprocess.check_output字节或字符串最低简单获取标准输出
stdout 参数需通过上下文获取结合其他方法使用
subprocess.run可选CompletedProcess通用命令执行
subprocess.Popen可选Popen 对象最高复杂交互场景

选择建议

  • 如果只需要捕获输出并处理异常,使用 subprocess.check_output

  • 如果需要更灵活的控制和交互,使用 subprocess.Popen

  • 如果只需要简单运行命令,使用 subprocess.run

有时候你使用check能打印输出但是获取不到文本信息 就只能使用popen或者run的stderr

result = subprocess.run(command,check=True,stderr=subprocess.PIPE,text=True,encoding='utf-8')
output = result.stderr
输入输出都要用这个去获取

那是因为他输出的不是在标准输出 是在stderr下

http://www.lryc.cn/news/572881.html

相关文章:

  • Docker 常用运维命令
  • 【系统规划与管理师第二版】1.3 新一代信息技术及发展
  • React ahooks——useRequest
  • 空壳V3.0,免费10开!
  • PowerShell批量处理文件名称/内容的修改
  • 【量化】策略交易之相对强弱指数策略(RSI)
  • websocket入门到实战(详解websocket,实战聊天室,消息推送,springboot+vue)
  • 【Docker基础】Docker镜像管理:docker commit详解
  • 【flink】 flink 读取debezium-json数据获取数据操作类型op/rowkind方法
  • “地标界爱马仕”再拓疆域:世酒中菜联袂赤水金钗石斛定义中国GI
  • GM DC Monitor v2.0 卸载教程
  • 通达信 多空寻龙指标系统:精准捕捉趋势转折与强势启动信号 幅图指标
  • Java八股文——消息队列「场景篇」
  • 思辨场域丨AR技术如何重塑未来学术会议体验?
  • 汽车加气站操作工考试题库含答案【最新】
  • 华为 FreeArc耳机不弹窗?
  • 容器技术人们与DOCKER环境部署
  • OSPF 路由协议基础实验
  • ZeroSearch:阿里开源无需外接搜索引擎的RL框架,显著提升LLM的搜索能力!!
  • AMHS工程项目中-MCS-STKC之间的office 测试场景的介绍
  • 搭建pikachu靶场
  • 【云创智城】YunCharge充电桩系统源码实现云快充协议深度解析与Java技术实践:打造高效充电桩运营系统
  • java面试题03静态修饰类,属性,方法有什么特点?
  • macOS - 根据序列号查看机型、保障信息
  • JavaWeb RESTful 开发规范入门
  • Spring 中的依赖注入(DI)详解
  • 通过Radius认证服务器实现飞塔/华为防火墙二次认证:原理、实践与安全价值解析
  • 20250620在Ubuntu20.04.6下编译KickPi的K7的Android14系统解决缺少libril.so.toc的问题
  • 【网络安全】ios逆向一般整理
  • 求助帖:学Java开发方向还是网络安全方向前景好