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

Python脚本未返回正确的错误状态,python,bash,shell,python-2.7,subprocess,Python,Bash,Shell,Python 2.7,Subprocess,我是python新手,需要一些帮助 PYTHON版本:2.7 脚本 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

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

PYTHON版本:2.7

脚本

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="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"

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

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

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

请注意,我已经更改了错误和结果消息,以便在不使用括号的情况下打印它们。此外,最好使用空列表为
False
这一事实来测试列表是否为空,而不是将其与
[]

进行比较。即使第一个命令出错,shell也会设置完整的管道
wc-l
报告它计算了“0”行,这就是['0']的来源。你可以在这篇文章中添加一个“bash”标记来获取更多细节,但我认为它是一个fork/exec,在管道设置后会发出错误(也就是说,顶级shell不知道程序不存在,它是一个fork副本,得到了那么多消息)


返回代码不会有任何帮助(shell提供管道中最后一个程序的返回代码)。您可以阅读stderr,但要小心那些在stderr上发出聊天流量的程序,即使这不是一个真正的错误。

Hi,这工作得很好,但您需要更改sys.stderr,“错误:%s”。格式('\n'.join(error))到
打印>>sys.stderr,“错误:%s”%format('\n'.join(error))
打印>>sys.stderr,“错误:%s”.format(''.join(error))
输出
错误:%s
得到它,将“%s”更改为“{}”