为什么 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 是什么。基本上 stderr
和 stdout
是文件描述符(默认为 1 和 2。)
在您的情况下,子命令不会向 1 和 2 文件描述符(因此 stderr
和 stdout
)写入任何内容,当然 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,因此您应该查看调用的命令。
我目前正在 运行使用下面指定的参数设置子进程。 一切似乎 运行 都很好。生成的输出符合预期,生成的日志没有显示错误。
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 是什么。基本上 stderr
和 stdout
是文件描述符(默认为 1 和 2。)
在您的情况下,子命令不会向 1 和 2 文件描述符(因此 stderr
和 stdout
)写入任何内容,当然 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,因此您应该查看调用的命令。