从os.system-Zabbix陷阱获取输出

时间:2019-01-04 08:13:17

标签: python python-2.7 zabbix

使用此代码,我使用陷阱程序将数据发送到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:没有一个对象不可迭代

1 个答案:

答案 0 :(得分:0)

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

还请注意,当您不使用-o时,您不希望如何引用shell=True的选项参数,以及原始函数将如何print而不是{{1} }结果。

我推测您想要的输出在stderr上,而不是stdout上;但我留给您确定。

如果return完全正确实现,则如果失败,它将返回一个非零的退出代码;否则,它将返回一个非零的退出代码。您应该处理此问题,而不是检查其可读的输出。对于zabbix_sender,如果被调用的进程返回失败状态,则会引发异常。

check=True

如果您在3.5之前仍受Python困扰,可以尝试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 和朋友。有关更多信息,请访问Running Bash commands in Python