首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python子进程返回代码采用不同的值

Python子进程返回代码采用不同的值
EN

Stack Overflow用户
提问于 2016-03-01 14:20:24
回答 1查看 663关注 0票数 1

我正在运行一个python脚本demo.py,如下所示:

代码语言:javascript
运行
复制
#!/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如下:

代码语言:javascript
运行
复制
#!/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如下所示:

代码语言:javascript
运行
复制
#!/bin/bash

cd /root/
mkdir foo

process_err打印相同的错误消息,但现在return_code的值为1.

问题出在哪里?

还请建议process.returncode采用除0和1以外的值的方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-01 14:24:16

这不是Python的问题,而是在mkdir之后继续执行的Bash脚本的问题。默认情况下,这就是Bash的工作方式,当它遇到错误时,您必须告诉它退出。

使用:

代码语言:javascript
运行
复制
#!/bin/bash
set -e

或者,如果您不能更改Bash脚本,并且只能更改Python代码:

代码语言:javascript
运行
复制
process = Popen(['bash', '-e', '/root/script.sh'], stdout = PIPE, stderr = PIPE)

来自help set

如果命令以非零状态退出,-e立即退出。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35725371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档