【问题标题】:get output from os.system-Zabbix trapper [duplicate]从 os.system-Zabbix trapper 获取输出 [重复]
【发布时间】:2019-01-04 08:13:17
【问题描述】:

通过这段代码,我使用 trapper 向 zabbix 发送数据:

def zabbix_sender(key, output):
    server = "1.2.2.4"
    hostname = "host"
    cmd = "zabbix_sender -z " + server + " -s " + hostname + " -k " + key +\
            " -o \"" + output +"\""
    print os.system(cmd)

它输出到屏幕

info from server: "processed: 1; failed: 0; total: 1; seconds spent: 0.000041"
sent: 1; skipped: 0; total: 1

我需要将上面的输出输出到变量,所以如果failed: 1 我可以创建错误处理。

目前我在调用此函数时得到 0 作为输出:

r = zabbix_sender (key,"failed")
                print  r

输出:0

尝试使用子流程:

r=subprocess.check_output(zabbix_sender (key,"failed"),shell=False) 
print r

TypeError:None 对象不可迭代

【问题讨论】:

  • 你显然需要subprocess.check_output 而不是 os.system,而不是os.system的输出。
  • 精确错误信息的重要性怎么强调都不过分。拼写是“可迭代的”,问题肯定是None 不是可迭代的。

标签: python python-2.7 zabbix


【解决方案1】:

os.system() 的返回值不是命令的输出。您想改用subprocess.run()

from subprocess import run, PIPE

def zabbix_sender(key, output):
    server = "1.2.2.4"
    hostname = "host"
    cmd = ["zabbix_sender", "-z", server, "-s",  hostname,
        "-k", key, "-o",  output]
    result = run(cmd, stdout=PIPE, stderr=PIPE
        universal_newlines=True, check=True)
    return result.stdout, result.stderr

还请注意,当您不使用 shell=True 时,您不想在选项参数周围引用 -o,以及您的原始函数将如何使用 print 而不是 return 结果。

我推测你想要的输出是在stderr,而不是stdout;但我让你来确定。

如果zabbix_sender 完全正确实现,如果失败,它将返回非零退出代码;你应该处理这个而不是检查它的人类可读的输出。对于check=True,如果被调用进程返回失败状态,则会引发异常。

def zabbix_sender(key, output):
    server = "1.2.2.4"
    hostname = "host"
    try:
        result = run(["zabbix_sender", "-z", server, "-s", hostname,
            "-k", key, "-o", output],
            stdout=PIPE, stderr=PIPE,
            universal_newlines=True, check=True)
         return result.stdout, result.stderr
    except CalledProcessError:
         # your zabbix error handling here
         # then probably
         return None

如果你在 Python 3.5 之前被卡住了,你可以试试subprocess.check_output 和朋友。更多信息请访问Running Bash commands in Python

【讨论】:

  • 谢谢,我正在使用 python 2.7 并获得 from subprocess import run, PIPE ImportError: cannot import name run 还安装了 pip install run
  • 就像我在上一段中写的那样,您可以在较旧的 Python 版本上使用 subprocess.check_output 而不是 subprocess.run。但也见刚才更新;您可能只想调用subprocess.check() 并捕获异常。链接的答案有(很多)更多细节。
  • 另外,你真的应该狂热地思考如何将你的代码迁移到 Python 3,这是该语言的支持和推荐版本。按照最初的时间表,Python 2 将在去年结束。它是僵尸;如果可以的话,你应该避免靠近它。
  • 好的,切换到 python 3 现在得到:return run.stdout, run.stderr AttributeError: 'function' object has no attribute 'stdout'
猜你喜欢
  • 1970-01-01
  • 2021-09-19
  • 1970-01-01
  • 2023-01-25
  • 1970-01-01
  • 1970-01-01
  • 2014-12-20
  • 2013-09-15
相关资源
最近更新 更多