InfluxDB脚本报错:'InfluxDBClient'无write_points属性,求正确脚本
修复InfluxDB写入Speedtest数据的AttributeError问题
错误原因
你遇到的AttributeError: 'InfluxDBClient' object has no attribute 'write_points',是因为当前使用的是InfluxDB v2.x客户端库,但调用了仅存在于v1.x客户端的write_points方法,二者API不兼容。
正确脚本
import re import subprocess from influxdb_client import InfluxDBClient from influxdb_client.client.write_api import SYNCHRONOUS # 执行Speedtest命令并获取输出 response = subprocess.Popen('/usr/bin/speedtest --accept-license --accept-gdpr', shell=True, stdout=subprocess.PIPE).stdout.read().decode('utf-8') # 解析测速结果 ping = re.search('Latency:\s+(.*?)\s', response, re.MULTILINE) download = re.search('Download:\s+(.*?)\s', response, re.MULTILINE) upload = re.search('Upload:\s+(.*?)\s', response, re.MULTILINE) jitter = re.search('Latency:.*?jitter:\s+(.*?)ms', response, re.MULTILINE) # 校验解析结果,避免匹配失败导致崩溃 if not all([ping, download, upload, jitter]): raise ValueError("Speedtest结果解析失败,请检查命令是否正常执行") ping_val = ping.group(1) download_val = download.group(1) upload_val = upload.group(1) jitter_val = jitter.group(1) # 构造InfluxDB数据格式 speed_data = [ { "measurement": "internet_speed", "tags": { "host": "Speedlink" }, "fields": { "download": float(download_val), "upload": float(upload_val), "ping": float(ping_val), "jitter": float(jitter_val) } } ] # InfluxDB配置 bucket = "SpeedtestMonitor" org = "Schmidt" token = "oM8PyToLgv-404hbNvH6BEIldKbSHy6h8WGYQYwSwkz1qrPnJ7brf5aW5sdsdsWtQO7GVou4XQRt51N1p-ozMWw==" url = "http://localhost:8086" # 初始化客户端和写入API client = InfluxDBClient(url=url, token=token, org=org) write_api = client.write_api(write_options=SYNCHRONOUS) # 写入数据到InfluxDB write_api.write(bucket=bucket, org=org, record=speed_data) # 关闭客户端连接 client.close()
关键修改点
- 导入
SYNCHRONOUS写入选项,确保数据同步写入InfluxDB - 用v2客户端的
write_api.write方法替代v1的write_points,明确指定bucket、组织和数据记录 - 增加解析结果的校验逻辑,避免因Speedtest输出格式变化或命令执行失败导致的崩溃
- 增加客户端连接关闭操作,优化资源占用
内容的提问来源于stack exchange,提问作者Louis Overhoff
相关产品推荐
相关产品推荐

