Python 子进程返回码采用不同的值
Python subprocess returncode takes on different values
我运行正在编写一个python脚本demo.py,如下所示:
#!/usr/bin/env python
from subprocess import Popen, PIPE, CalledProcessError
try:
process = Popen(["/root/script.sh"], stdout = PIPE, stderr = PIPE)
process_out, process_err = process.communicate()
return_code = process.returncode
if process_out:
print "output:", process_out
if process_err:
print "error:", process_err
print "return code:", return_code
except CalledProcessError as e:
print "CalledProcessError:", e
except Exception, fault:
print "fault:", fault
script.sh如下:
#!/bin/bash
cd /root/
mkdir foo
cd foo
cat << EOF > bar.txt
random text
EOF
目录 foo 已经存在。因此,script.sh 应该会失败,而且确实会失败。 demo.py 正确捕获了 process_err 中的错误并打印出来:
error: mkdir: cannot create directory `foo': File exists
但是return_code的值还是0(表示成功运行)。
如果我的script.sh如下:
#!/bin/bash
cd /root/
mkdir foo
process_err 打印相同的错误消息 但现在 return_code 的值为 1。
问题出在哪里?
还请建议 process.returncode 取 0 和 1 以外的值的场景。
这不是 Python 的问题,而是 Bash 在 mkdir
之后继续执行的脚本的问题。 Bash默认是这样的,遇到错误就得告诉它退出。
使用:
#!/bin/bash
set -e
或者,如果您无法更改 Bash 脚本并且只能更改 Python 代码:
process = Popen(['bash', '-e', '/root/script.sh'], stdout = PIPE, stderr = PIPE)
来自help set
:
-e
Exit immediately if a command exits with a non-zero status.
我运行正在编写一个python脚本demo.py,如下所示:
#!/usr/bin/env python
from subprocess import Popen, PIPE, CalledProcessError
try:
process = Popen(["/root/script.sh"], stdout = PIPE, stderr = PIPE)
process_out, process_err = process.communicate()
return_code = process.returncode
if process_out:
print "output:", process_out
if process_err:
print "error:", process_err
print "return code:", return_code
except CalledProcessError as e:
print "CalledProcessError:", e
except Exception, fault:
print "fault:", fault
script.sh如下:
#!/bin/bash
cd /root/
mkdir foo
cd foo
cat << EOF > bar.txt
random text
EOF
目录 foo 已经存在。因此,script.sh 应该会失败,而且确实会失败。 demo.py 正确捕获了 process_err 中的错误并打印出来:
error: mkdir: cannot create directory `foo': File exists
但是return_code的值还是0(表示成功运行)。
如果我的script.sh如下:
#!/bin/bash
cd /root/
mkdir foo
process_err 打印相同的错误消息 但现在 return_code 的值为 1。
问题出在哪里?
还请建议 process.returncode 取 0 和 1 以外的值的场景。
这不是 Python 的问题,而是 Bash 在 mkdir
之后继续执行的脚本的问题。 Bash默认是这样的,遇到错误就得告诉它退出。
使用:
#!/bin/bash
set -e
或者,如果您无法更改 Bash 脚本并且只能更改 Python 代码:
process = Popen(['bash', '-e', '/root/script.sh'], stdout = PIPE, stderr = PIPE)
来自help set
:
-e
Exit immediately if a command exits with a non-zero status.