【问题标题】:Python script not returning correct error statusPython脚本未返回正确的错误状态
【发布时间】:2013-08-14 18:32:38
【问题描述】:

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

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"

【问题讨论】:

    标签: python bash shell python-2.7 subprocess


    【解决方案1】:

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

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

    请注意,我已更改错误和结果消息,因此它们在打印时不带括号。此外,最好使用空列表为False这一事实来测试列表是否为空,而不是与[] 进行比较。

    【讨论】:

    • 嗨,这很好用,但您需要将 print >>sys.stderr, "ERROR: %s".format('\n'.join(error)) 更改为 print >>sys.stderr, "ERROR: %s" % format('\n'.join(error))
    • print >>sys.stderr, "ERROR: %s".format(''.join(error)) 输出ERROR: %s
    • 知道了,把“%s”改成“{}”
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多