Python脚本未返回正确的错误状态
我是python新手,需要一些帮助 PYTHON版本:2.7 脚本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
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”更改为“{}”