当使用 msvc 编译器 cl.exe 作为命令时,subprocess.run 不会在 stderr 上抛出错误

问题描述 投票:0回答:1

Python 3.12.0、Windows 10、MSVC 14.3

from subprocess import run
command = ['cl', ...]
proc = run(command, stdout=subprocess.PIPE, shell=True, text=True, stderr=subprocess.PIPE)
output = proc.stdout.splitlines()
errors = proc.stderr.splitlines()

当编译器没有产生任何错误时,列表errors为空,但是当编译器抛出错误时,它会转到列表output而不是列表errors。在 Windows 上使用 mingw32 工具链时并非如此。如果编译时出现任何错误,错误消息将进入列表errors。看来 msvc 编译器 cl.exe 正在向 stdout 而不是 stderr 抛出错误消息。

如何正确地将错误传递到errors列表?

我能想到的一个选择是将错误传递到标准输出并检查返回代码。如果它不是 0,那么我相信该过程引发了一些错误,您可以解析输出列表以进行进一步调查。我在吗?

python subprocess
1个回答
0
投票

微软的想法,stdout 和 stderr 的内容与你的预期有点不同。使用 cl,标头/版权信息将发送至 stderr,其他所有信息将发送至 stdout。

# Full output
$ cl /c hello.c
Microsoft (R) C/C++ Optimizing Compiler Version 19.38.33135 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

hello.c
hello.c(3): error C2143: syntax error: missing ';' before '}'

# stderr only
$ cl /c hello.c >/dev/null
Microsoft (R) C/C++ Optimizing Compiler Version 19.38.33135 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.


# stdout only
$ cl /c hello.c 2>/dev/null
hello.c
hello.c(3): error C2143: syntax error: missing ';' before '}'
© www.soinside.com 2019 - 2024. All rights reserved.