我想使用运行命令subprocess.run()
然后将其 stdout/stderr 作为字符串获取,但我希望子进程在运行时也能正常将其输出打印到控制台。如果我做
result = subprocess.run(['ls', '-al'])
然后我可以看到打印到控制台的输出,但在命令运行后我无法访问输出。如果我做
result = subprocess.run(['ls', '-al'], capture_output=True, text=True)
我可以访问result.stdout
and result.stderr
但命令运行时控制台上不会打印任何内容。我可以同时打印到控制台并保存到result.stdout
?
从文档subprocess.run https://docs.python.org/3/library/subprocess.html#subprocess.run :
运行 args 描述的命令。等待命令完成,然后返回 CompletedProcess 实例。
[...]
If 捕获输出为 true 时,stdout 和 stderr 将被捕获。使用时,内部 Popen 对象会自动创建stdout=PIPE
and stderr=PIPE
.
的文档subprocess.PIPE https://docs.python.org/3/library/subprocess.html#subprocess.PIPE say :
可以用作特殊值stdin, stdout or stderr论证Popen https://docs.python.org/3/library/subprocess.html#subprocess.Popen并指示应打开通往标准流的管道。对于 Popen.communicate() 最有用。
该文档为Popen构造函数 https://docs.python.org/3/library/subprocess.html#popen-constructor范围stdout
:
stdin、stdout 和 stderr 分别指定执行程序的标准输入、标准输出和标准错误文件句柄。有效值为 PIPE、DEVNULL、现有文件描述符(正整数)、现有文件描述符文件对象 https://docs.python.org/3/glossary.html#term-file-object, and None
.
所以使用capture_output=True
是不行的,因为输出将存储在管道中供您读取after通话结束。
更简单的供您使用subprocess.Popen https://docs.python.org/3/library/subprocess.html#popen-constructor正如@MatBBastos建议的那样,你可以communicate https://docs.python.org/3/library/subprocess.html#subprocess.Popen.communicate(反复发送内容到stdin并从接收内容stdout/stderr). The 解决方案链接 https://stackoverflow.com/a/4417735/11384184有点过时了(参见它自己的评论;Python 2),但应该可以很好地工作。一个相关的解决方案是这个。
继续使用subprocess.run
,您必须提供文件描述符 as stdout
参数,其中我不知道怎么办必须重定向到文件对象 https://docs.python.org/3/glossary.html#term-file-object这就是你想要的:写入标准流,但也在内存中保留一个副本以供以后使用。
有文档在io https://docs.python.org/3/library/io.html模块,并且 Stack Overflow 上有很多关于做类似事情的问题,但它明显比其他方式更困难。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)