为什么 subprocess.run return 退出代码为 2 但日志中没有错误?

Why does subprocess.run return an exit code of 2 but no errors in log?

我目前正在 运行使用下面指定的参数设置子进程。 一切似乎 运行 都很好。生成的输出符合预期,生成的日志没有显示错误。

exit_code = subprocess.run([cmd, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11], capture_output=True)

但是我得到一个 return 代码/退出代码 2。

当我打印上面的 exit_code 时,stderr 和 stdout 显示如下。

returncode=2, stderr=b'', stdout=b''

为什么我会得到预期的输出并且日志中没有错误,但仍然得到退出代码 2? 有没有办法弄清楚为什么退出代码是 returning 2? b'' 对于 stderr 和 stdout 意味着什么?

我正在 运行使用 subprocess.run 编写 SAS 程序。 这仅发生在某些 SAS 程序中。 它确实发生的那个似乎生成 pdf 文件。 另外,如果我在 .bat 文件中使用 subprocess.run 中指定的完全相同的参数,它 运行 可以正常使用退出代码 0.

首先,很高兴知道您使用的 OS 是什么。基本上 stderrstdout 是文件描述符(默认为 1 和 2。)

在您的情况下,子命令不会向 1 和 2 文件描述符(因此 stderrstdout)写入任何内容,当然 return 代码是 2

如果您运行以下代码:

import subprocess

result = subprocess.run(["echo", "test"])
print(result.returncode, result.stdout, result.stderr)

你得到:

>>> python3 test.py
test
0 None None

这意味着 echo 运行 正确并将 test 写入标准输出,但 result.stdout 不包含它。发生这种情况,但您没有将命令的 STDOUT 重定向到 PIPE。

如果将代码更改为:

import subprocess

result = subprocess.run(["echo", "test"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print(result.returncode, result.stdout, result.stderr)

您将获得:

>>> python3 test.py
0 b'test\n' b''

所以现在 result.stdout 包含被调用命令的 STDOT(以字节为单位)。对于 STDERR 是正确的。

如果将 shell 参数设置为 True,我可以 运行 无效(不存在)命令,如下所示:

import subprocess

result = subprocess.run(["invalid_cmd"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
print(result.returncode, result.stdout, result.stderr)

在这种情况下输出是:

>>> python3 test.py
127 b'' b'/bin/sh: invalid_cmd: command not found\n'

这意味着 return 代码是 127,STDOUT 为空,但 STDERR 包含 /bin/sh: invalid_cmd: command not found\n 字节的消息。

如果您执行了上述操作但没有看到任何输出,那么您调用的命令不会写入 STDOUT 或 STDERR,因此您应该查看调用的命令。