0

我是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要在其他机器上执行的字符串更改为一些不相关的字符串,我也没有收到错误消息,比如我将命令更改为以下值并再次运行脚本。

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

2 回答 2

1

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

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

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

请注意,我已经更改了错误和结果消息,因此它们在不带括号的情况下打印。此外,最好通过使用空列表False而不是比较的事实来测试列表是否为空[]

于 2013-08-14T18:51:38.903 回答
1

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

返回码无济于事(shell 为您提供管道中最后一个程序的返回码)。您可以阅读 stderr,但要小心那些在 stderr 上发出闲聊流量的程序,即使它不是真正的错误。

于 2013-08-14T19:06:53.097 回答