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,那么我相信该过程引发了一些错误,您可以解析输出列表以进行进一步调查。我在吗?
微软的想法,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 '}'