为何subprocess.run()直接返回CompletedProcess,取stdout才得字符串?
关于subprocess.run()返回值的疑问解答
首先明确:subprocess.run()的返回值永远是subprocess.CompletedProcess类的实例,和你是否设置universal_newlines/text=True无关——这个参数只是控制stdout/stderr的类型是字符串还是字节串,不改变返回值的整体类型。
你看到的那些“不用.stdout”的示例,通常是以下两种情况:
- 不需要获取命令输出内容:比如示例只是演示如何执行命令、开启
check=True处理执行错误,或者只关心命令是否执行成功,自然不需要提取stdout属性。 - 字符串上下文的自动转换:如果直接把
CompletedProcess实例放到需要字符串的场景(比如print(out)),Python会自动调用它的字符串表示方法,输出内容里会包含stdout、stderr、返回码等信息,看起来像是拿到了输出,但实际上你拿到的还是对象本身,不是纯输出字符串。
举个例子验证这个区别:
import subprocess # 直接获取CompletedProcess实例 out_obj = subprocess.run(['echo', 'hello'], capture_output=True, text=True) print(out_obj) # 输出:CompletedProcess(args=['echo', 'hello'], returncode=0, stdout='hello\n', stderr='') # 提取stdout字符串 out_str = subprocess.run(['echo', 'hello'], capture_output=True, text=True).stdout print(out_str) # 输出:hello
另外补充:universal_newlines=True(等同于text=True)的作用确实是把原本字节类型的stdout/stderr转换成字符串,但这只改变这两个属性的类型,不改变run()返回值的类型。
内容的提问来源于stack exchange,提问作者Arcuvia
相关产品推荐
相关产品推荐

