我正在运行一个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:", faultscript.sh如下:
#!/bin/bash
cd /root/
mkdir foo
cd foo
cat << EOF > bar.txt
random text
EOF目录foo已经存在。因此,script.sh应该失败,而且它确实失败了。demo.py正确捕获process_err中的错误并打印出来:
错误: mkdir:无法创建目录“`foo”:文件存在
,但是return_code的值仍然是0 (这表示成功运行)。
如果我的script.sh如下所示:
#!/bin/bash
cd /root/
mkdir fooprocess_err打印相同的错误消息,但现在return_code的值为1.。
问题出在哪里?
还请建议process.returncode采用除0和1以外的值的方案。
发布于 2016-03-01 14:24:16
这不是Python的问题,而是在mkdir之后继续执行的Bash脚本的问题。默认情况下,这就是Bash的工作方式,当它遇到错误时,您必须告诉它退出。
使用:
#!/bin/bash
set -e或者,如果您不能更改Bash脚本,并且只能更改Python代码:
process = Popen(['bash', '-e', '/root/script.sh'], stdout = PIPE, stderr = PIPE)来自help set
如果命令以非零状态退出,
-e立即退出。
https://stackoverflow.com/questions/35725371
复制相似问题