Python os.system() 返回错误值

Python os.system() returning bad value

本文关键字:返回 错误 os system Python      更新时间:2023-10-16

背景:我正在使用带有os.system((的Python脚本来重复调用命令行程序来运行测试用例。正在测试的程序对于正常操作返回零,对于错误条件返回负值。我将这个值与预期值(并不总是零(进行比较,作为确定通过/失败的一部分。

问题是正常退出的测试用例返回零,但 os.system(( 返回 -1073740940。到目前为止,其他非零返回正在按预期工作,尽管样本很小。

我相当有信心被调用的程序返回零,因为我在返回之前将返回值输出到 std out。 此外,如果使用命令行或批处理文件中的相同输入运行程序,则返回值为零。

可能相关,C++程序使用 ofstream 生成一个日志文件,其内容与命令行相同 - 相同的缓冲区被发送到 std::cout 和日志文件。当由 os.system(( 调用控制时,日志文件内容在程序执行过程中大约 80% 停止,即使 cout 信息正常继续。与返回值一样,如果使用命令行或批处理文件中的相同输入运行,日志文件将正确完成,并且具有与终端相同的内容。

在 Python 2.7 和 3.8 下,返回值和日志文件问题的行为是相同的。

我的问题是:我如何诊断这个? 我不确定还能尝试什么。

您正在使用 os.system,它不会像您期望的那样返回退出代码,而是返回不同的代码。

在 https://docs.python.org/3.8/library/os.html#os.system 你可以阅读

在 Unix 上,返回值是以 wait(( 指定的格式编码的进程的退出状态。注意 POSIX 没有指定 C system(( 函数的返回值的含义,因此 Python 函数的返回值是依赖于系统的。

所以要么使用subprocess.call,要么做类似的事情

rslt = os.system("whatever")
exit_code = 0xff & rslt

因此,简短的回答是,我得到的值是程序的退出代码,除非Windows觉得它有重要的事情要说。

在这种情况下,我调用的 DLL 正在损坏堆并导致窗口中止执行。要获得实际的 32 位 Windows 返回代码而不是符号扩展版本,我需要使用它0xffffffff。我不知道我是否能回答我自己的问题,但杰洛尼达让我走上了正确的道路。