python - 从 os.system-Zabbix trapper 获取输出
问题描述
使用此代码,我使用 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 对象不可迭代
解决方案
from 的返回值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
当您不使用时,您不希望在 option 参数周围引用shell=True
,以及原始函数将如何print
代替return
结果。
我推测您想要的输出在标准错误上,而不是标准输出上;但我把这留给你来确定。
如果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
如果你在 3.5 之前被 Python 卡住了,你可以试试subprocess.check_output
和朋友。在 Python中运行 Bash 命令的更多信息。
推荐阅读
- database - TypeORM 生成带有数据库名称的迁移
- google-sheets-formula - 具有水平日期范围和列标准的 SUMIFS
- python - 如何打印出异常来自的行
- php - PHP中多维数组的输出
- python - 您能否将 tf.keras.applications 中的预制模型用于一维时间序列数据?
- amazon-web-services - 如何在 Python Chalice 中创建 API 网关和 SQS 之间的直接集成
- python - 如何在并行化函数中将几何图形添加到地理数据框中?
- postgresql - 根据postgrersql中的列数据变化创建一个过程
- php - 由于某种原因,CSV 导入用 NULL 填充记录
- function - 仅使用 map 函数找出两个列表是否有一些共同的元素