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