Python脚本未返回正确的错误状态

时间:2013-08-14 18:32:38

标签: python bash shell python-2.7 subprocess

我是python的新手,需要一些帮助!

PYTHON VERSION: 2.7

SCRIPT

import subprocess
import sys

HOST="user@machine"
COMMAND="ps -fu user | grep \"XYZ\" |grep -v grep |wc -l"  #Command to be run

ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)

result = ssh.stdout.readlines()

if result == []:
        error = ssh.stderr.readlines()
        print >>sys.stderr, "ERROR: %s" % error
else:
        result = [qaz.strip('\n') for qaz in result]
        print result

此脚本会产生以下输出:

['0']

问题

即使将在其他计算机上执行的COMMAND更改为某些不相关的字符串,我也没有收到错误消息,例如我将命令更改为低于值并再次运行脚本。

COMMAND="adsasdadsps -fu user | grep \"XYZ\" |grep -v grep |wc -l"

现在脚本也会产生相同的输出。

['0']

但是当我改变命令如下。

COMMAND="asdadasd"

然后我得到了输出。

ERROR: ['ksh: line 1: asdadasd: not found\n']

任何人都可以帮助我理解为什么我没有收到

的错误消息
COMMAND="adsasdadsps -fu user | grep \"XYZ\" |grep -v grep |wc -l"

2 个答案:

答案 0 :(得分:1)

您可能想要更改逻辑,以便检查stderr是否为空:

result = ssh.stdout.readlines()
error = ssh.stderr.readlines()

if error:
    print >>sys.stderr, "ERROR: {}".format(''.join(error))
else:
    print ''.join(result)

请注意,我更改了错误和结果消息,因此无需括号即可打印。此外,最好通过使用空列表为False而不是与[]进行比较来测试列表是否为空。

答案 1 :(得分:1)

它是一个贝壳的东西。即使第一个命令错误,shell也会设置完整的管道。 wc -l报告它计为'0'行,而这是['0']来自的地方。您可以在此帖子中添加'bash'标签以获取更多详细信息,但我认为它是一个fork / exec,它在管道设置后发出错误(也就是说,顶级shell不知道程序没有存在,它是一个分叉的副本,得到了一点点新闻。)

返回代码没有帮助(shell为您提供管道中最后一个程序的返回代码)。您可以阅读stderr,但要注意在stderr上发出繁琐流量的程序,即使它不是真正的错误。