【发布时间】:2019-01-14 14:02:19
【问题描述】:
问题
给定一个在 python 中启动的子进程,其代码类似于:
import subprocess
p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.communicate()
print('Return code: {}'.format(p.returncode))
根据official documentation,可以检查子进程是否被信号终止:
负值 -N 表示子进程被信号 N 终止(仅限 POSIX)。
但仅限于 POSIX 平台。
有没有办法在 Windows 平台上检查进程是否被信号终止(不管是哪一个)?
背景
我在运行 googletest 的测试时遇到了这个问题。 break-on-failure CLI flag test 在 Windows 平台(VC14、VS2017)上失败,但在 POSIX 平台(2x Ubuntu、2x macOS)上运行良好。
在命令行上手动得到以下结果:
> .\googletest-break-on-failure-unittest_.exe --gtest_break_on_failure
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from Foo
[ RUN ] Foo.Bar
<some path>\googletest\test\googletest-break-on-failure-unittest_.cc(52): error: Expected equality of these values:
2
3
> echo %ERRORLEVEL%
-2147483645
但是,调用此测试的 python 包装器会收到 2147483651(正数)。
(我刚刚在this line之前添加了一个打印)
请注意,这些是指十六进制的数字0xFFFFFFFF80000003(负数)和0x80000003(正数),并且返回代码没有进一步处理。 (见here)
返回码为什么会这样改?
PS:是的,我检查了 C++ 代码中的 GTEST_OS_WINDOWS 和 GTEST_HAS_SEH 是否正确。
【问题讨论】:
标签: python windows subprocess signals