我是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"
答案 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上发出繁琐流量的程序,即使它不是真正的错误。