子流程.Popen stdout和stderr值不匹配



我正在尝试使用Python3subprocess模块的Popen命令来编写脚本。我正在尝试获得以下几个已安装软件的版本。

from subprocess import Popen, PIPE
nginx_version, err = Popen(["nginx", "-v"], stdout=PIPE, stderr=PIPE).communicate()
print("Nginx Version:" + nginx_version.decode("utf-8"))
print("Stderr:" + err.decode("utf-8"))
###################OUTPUT####################
Nginx Version:
Stderr: nginx version: nginx/1.16.1

有没有办法以标准方式转换和处理STDOUT和STDERR?

这种行为看起来很奇怪,文档明确地声明

communication((返回一个元组(stdout_data,stderr_data(。如果流以文本模式打开,则数据将是字符串;否则为字节。

我将按照以下方式设置它,注意使用text=True以避免对字节输出进行解码。

from subprocess import Popen, PIPE
def get_version(name):
proc = Popen([name, "--version"], stdout=PIPE, stderr=PIPE, text=True)
program_version, stderr = proc.communicate()
exitcode = proc.returncode
return program_version.strip(), stderr.strip(), exitcode
nginx_version, stderr, exit_code = get_version("nginx")
if exit_code == 0:
print("Nginx Version: " + nginx_version)
else:
print("Stderr: " + stderr)

运行上面的代码时是否会发生同样的不匹配?

相关内容

  • 没有找到相关文章

最新更新