Изменение вывода speedtest.py и speedtest-cli для включения IP-адреса в выходной файл .csv - PullRequest
0 голосов
/ 30 мая 2020

Я добавил строку в код python speedtest.py, который я нашел на pimylifeup.com. Я надеялся, что это позволит мне отслеживать провайдера inte rnet и IP-адрес вместе со всей другой информацией о скорости, которую предоставляет его код. Но когда я его выполняю, код захватывает только следующее слово после вызова find all. Я также хотел бы, чтобы он возвращал IP-адрес, который появляется после провайдера. Я прикрепил код ниже. Можете ли вы помочь мне изменить его, чтобы вернуть то, что я ищу.

Вот пример того, что возвращает speedtest-cli

$ speedtest-cli
Retrieving speedtest.net configuration...
Testing from Biglobe (111.111.111.111)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by GLBB Japan (Naha) [51.24 km]: 118.566 ms
Testing download speed................................................................................
Download: 4.00 Mbit/s
Testing upload speed......................................................................................................
Upload: 13.19 Mbit/s
$

И это пример того, что это было возвращено speediest.py в мой файл .csv

Date,Time,Ping,Download (Mbit/s),Upload(Mbit/s),myip

05/30/20,12:47,76.391,12.28,19.43,Biglobe

Это то, что я хочу вернуть.

Date,Time,Ping,Download (Mbit/s),Upload (Mbit/s),myip

05/30/20,12:31,75.158,14.29,19.54,Biglobe 111.111.111.111

Или, может быть,

05/30/20,12:31,75.158,14.29,19.54,Biglobe,111.111.111.111

Вот код, который я использую. И спасибо за любую помощь, которую вы можете оказать.

import os
import re
import subprocess
import time

response = subprocess.Popen(‘/usr/local/bin/speedtest-cli’, shell=True, stdout=subprocess.PIPE).stdout.read().decode(‘utf-8’)

ping = re.findall(‘km]:\s(.*?)\s’, response, re.MULTILINE)
download = re.findall(‘Download:\s(.*?)\s’, response, re.MULTILINE)
upload = re.findall(‘Upload:\s(.*?)\s’, response, re.MULTILINE)
myip = re.findall(‘from\s(.*?)\s’, response, re.MULTILINE)

ping = ping[0].replace(‘,’, ‘.’)
download = download[0].replace(‘,’, ‘.’)
upload = upload[0].replace(‘,’, ‘.’)
myip = myip[0]

try:
f = open(‘/home/pi/speedtest/speedtestz.csv’, ‘a+’)
if os.stat(‘/home/pi/speedtest/speedtestz.csv’).st_size == 0:
f.write(‘Date,Time,Ping,Download (Mbit/s),Upload (Mbit/s),myip\r\n’)
except:
pass

f.write(‘{},{},{},{},{},{}\r\n’.format(time.strftime(‘%m/%d/%y’), time.strftime(‘%H:%M’), ping, download, upload, myip))

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Сообщите мне, работает ли это для вас, он должен делать все, что вы ищете

#!/usr/local/env python
import os
import csv
import time
import subprocess
from decimal import *

file_path = '/home/pi/speedtest/speedtestz.csv'

def format_speed(bits_string):
  """ changes string bit/s to megabits/s and rounds to two decimal places """
  return (Decimal(bits_string) / 1000000).quantize(Decimal('.01'), rounding=ROUND_UP)

def write_csv(row):
  """ writes a header row if one does not exist and test result row """
  # straight from csv man page
  # see: https://docs.python.org/3/library/csv.html
  with open(file_path, 'a+', newline='') as csvfile:
    writer = csv.writer(csvfile, delimiter=',', quotechar='"')

    if os.stat(file_path).st_size == 0:
      writer.writerow(['Date','Time','Ping','Download (Mbit/s)','Upload (Mbit/s)','myip'])

    writer.writerow(row)


response = subprocess.run(['/usr/local/bin/speedtest-cli', '--csv'], capture_output=True, encoding='utf-8')

# if speedtest-cli exited with no errors / ran successfully
if response.returncode == 0:

  # from the csv man page
  # "And while the module doesn’t directly support parsing strings, it can easily be done"
  # this will remove quotes and spaces vs doing a string split on ','
  # csv.reader returns an iterator, so we turn that into a list
  cols = list(csv.reader([response.stdout]))[0]

  # turns 13.45 ping to 13
  ping = Decimal(cols[5]).quantize(Decimal('1.'))

  # speedtest-cli --csv returns speed in bits/s, convert to bytes
  download = format_speed(cols[6])
  upload = format_speed(cols[7])

  ip = cols[9]

  date = time.strftime('%m/%d/%y')
  time = time.strftime('%H:%M')

  write_csv([date,time,ping,download,upload,ip])

else:
  print('speedtest-cli returned error: %s' % response.stderr)

0 голосов
/ 30 мая 2020
$/usr/local/bin/speedtest-cli --csv-header > speedtestz.csv
$/usr/local/bin/speedtest-cli --csv >> speedtestz.csv

вывод:

Server ID,Sponsor,Server Name,Timestamp,Distance,Ping,Download,Upload,Share,IP Address

Разве это не дает вам то, что вы ищете? Выполните первую команду один раз, чтобы создать CSV со строкой заголовка. Затем последующие запуски выполняются с помощью оператора добавления '>> `, и он будет добавлять строку результатов теста каждый раз, когда вы его запускаете

Выполнение всех этих регулярных выражений укусит вас, если они или библиотека, от которой они зависят on решает изменить свой формат вывода отладки

Однако существует множество способов сделать это. Надеюсь, это поможет

...