当前位置: 首页 > 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下

check=True的含义一句话:
“只要外部命令返回非 0,就立即抛subprocess.CalledProcessError,不让程序继续跑。”

http://www.jsqmd.com/news/609179/

相关文章:

  • ArozOS部署最佳实践:5个关键步骤确保系统稳定运行
  • 光伏逆变器测试避坑:派能协议下电流值5倍偏差的修复实录
  • 10-汽车销售系统的设计与实现
  • Gemma-3 Pixel Studio步骤详解:顶部像素面板交互设计与GPU算力适配方案
  • Mem Reduct:5MB级内存清理工具让Windows系统效率提升300%的技术实践
  • Visual Studio 2022 版本对决:Community、Professional 与 Enterprise 全方位深度解析
  • 内存分配算法(系统分配算法~应用常见算法)
  • EtchDroid多语言支持实践:如何为全球用户提供本地化体验
  • GitHub中文化插件:3分钟实现GitHub全面中文界面的终极指南
  • 飞书文档批量导出架构实战:企业级知识库迁移的高效解决方案
  • BEMCheckBox完全自定义教程:掌握6种动画类型和外观属性
  • 紧急制动(AEB )模型,Carsim与Simulink联合仿真。 车辆行驶过程中,利用主动制动的方式躲避前方障碍物。主要利用制动安全距离进行判断
  • 海思Hi3516DV500实战:从陀螺仪数据异常到稳定防抖,我踩过的那些坑(附完整调试命令)
  • 3分钟搞定Goods查询页:Map传参+StringUtils分割符实战(附避坑指南)
  • 网易云音乐体验升级:BetterNCM插件管理器全攻略
  • MyCLI:一个增强型MySQL命令行客户端
  • 去屑洗发水哪个效果好? - 中媒介
  • 终极启动盘制作工具:Deepin Boot Maker 完整使用指南
  • 高防服务器被攻击后 IP 被封?黑洞解封与清洗策略设置
  • 如何掌握递归与迭代:编程思维深度训练指南
  • Pretext:值得关注的文本排版引擎啡
  • 西门子S7-200 SMART高速计数器实战:从模式配置到脉冲精准捕获
  • 主席树实战:C++实现区间第K小查询(附动态图解与完整代码)
  • 安卓逆向浅浅范围
  • 高防服务器无法远程连接?端口、防火墙与安全组排查
  • 头发干枯毛躁用什么洗发水? - 中媒介
  • 掌握Vue 3日历组件实战:从业务场景到深度定制的全流程指南
  • 当cl软件节点标红无法上网的时候-可能是因为电脑的时间没有同步过来,可以通过右下角右键-调整日期和时间-点击立即同步即可同步北京时间-方法二,使用SyncTime-Aliyun.bat软件同步时间。-
  • 聚酰亚胺薄膜价格怎么样? - 中媒介
  • Git团队协作终极指南:10个提升项目可维护性的关键实践