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

张开发
2026/4/8 20:07:22 15 分钟阅读

分享文章

subprocess.check_output和stdout有什么不同 还有run和popen
subprocess模块提供了多种方法来运行外部命令并且可以捕获标准输出、标准错误等。以下是subprocess.check_output、stdout参数、subprocess.run和subprocess.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(fError: {e})2.stdout参数用途用于指定subprocess中标准输出的去向。可以设置为subprocess.PIPE将输出捕获到管道中。subprocess.DEVNULL丢弃输出。sys.stdout将输出直接打印到控制台。行为结合subprocess.run或subprocess.Popen使用。默认情况下stdout会打印到控制台。示例result subprocess.run([echo, Hello, World!], stdoutsubprocess.PIPE, textTrue) print(result.stdout) # 捕获标准输出3.subprocess.run用途运行命令并等待其完成。行为返回一个subprocess.CompletedProcess对象。默认情况下标准输出和标准错误会打印到控制台。可以通过参数如stdout、stderr、capture_output等控制输出和错误的处理。优点简洁且功能强大。可以控制命令的执行方式。示例# 默认输出到控制台 subprocess.run([echo, Hello, World!]) # 捕获输出 result subprocess.run([echo, Hello, World!], stdoutsubprocess.PIPE, textTrue) print(result.stdout)4.subprocess.Popen用途创建一个子进程并与其交互。行为是subprocess模块的底层实现提供了更多灵活性。可以通过管道与子进程进行交互例如stdin、stdout、stderr。需要手动调用.wait()等待子进程结束。优点灵活性高适合复杂的交互场景。可以动态地与子进程交互。示例# 创建子进程 process subprocess.Popen([echo, Hello, World!], stdoutsubprocess.PIPE, textTrue) # 与子进程交互 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的stderrresult subprocess.run( command, checkTrue, stderrsubprocess.PIPE, textTrue, encodingutf-8 ) output result.stderr 输入输出都要用这个去获取那是因为他输出的不是在标准输出 是在stderr下checkTrue的含义一句话“只要外部命令返回非 0就立即抛subprocess.CalledProcessError不让程序继续跑。”

更多文章