#はじめに
なんとなくウチのインターネット遅くね?って気持ちになったので、具体的にどのくらいの速度で動いてくれているのか、speedtestを使って測ってみることにしました。
ついでに結果をどこかしらに出力してくれたら嬉しいなーということで、pythonからspeedtestを実行し、speedtestを行った日付、時間帯と共にexcelに出力させてみました。
#やってみたこと
1. speedtestをpythonを通じて実行する
2. 結果をexcelシートに出力する。その際に、speedtestを行った日付、時間帯も併せて記載する
#環境
・windows10
・python3.7.2
#使用したspeedtestツール
使用したツールは、こちら。CLIでspeedtestを行えます。オプションでPNGファイルを生成することもできる、優れものです。
参考にしたのは、GitHubとこちらのブログ。cmdからのspeedtestで十分って気持ちにもなってきます。。
#speedtestをpythonを通じて実行する
参考にしたのは、このQiita投稿。9割9分写経です。。
import sys
import speedtest
def get_speed_test():
servers = []
stest = speedtest.Speedtest()
stest.get_servers(servers)
stest.get_best_server()
return stest
def command_line_runner():
stest = get_speed_test()
down_result = stest.download()
up_result = stest.upload()
mbps_down_result = down_result / 1024 /1024
mbps_up_result = up_result / 1024 /1024
result = [mbps_down_result, mbps_up_result]
print(result)
command_line_runner()
出力は、こんな感じ。
python speedtest_wifi.py
[16.08899947399507, 4.28247380989742]
下りが大体16Mbps、上りが大体4Mbpsみたいですね。
#結果をexcelシートに出力する。その際に、speedtestを行った日付、時間帯も併せて記載する
参考にしたのがこちらとこちら。
speedtestの測定結果が、excelシート上の表の末尾に追加されるようにしています。
下に載せている私のコードからは消しましたが、そもそものexcelシートの作成も、pythonから行いました。最初の1回だけはexcelシートを作成し、2回目以降は測定結果を追記していくような書き方にできないものでしょうか。今後の課題ですね。(手を付けない気がする)
appendするリストの0番目を、speedtest測定時の日付&時間帯とし、以降の要素に、speedtest測定結果を入れています。
speedtest_wifi.py で、下りの測定結果と上りの測定結果をリストに格納しているので、一度バラしてリストに格納しなおしています。(上で載せたものから、excelシート出力用にちょっと手直し)
import sys
import speedtest
def get_speed_test():
servers = []
stest = speedtest.Speedtest()
stest.get_servers(servers)
stest.get_best_server()
return stest
def command_line_runner():
stest = get_speed_test()
down_result = stest.download()
up_result = stest.upload()
mbps_down_result = down_result / 1024 /1024
mbps_up_result = up_result / 1024 /1024
result = [mbps_down_result, mbps_up_result]
return result
if __name__ == '__main__':
command_line_runner()
import speedtest_wifi as sp
import xlwt
import openpyxl
import pandas as pd
import datetime as dt
wb = openpyxl.load_workbook("speedtest_by_python.xlsx")
sheet = wb.worksheets[0]
dt_now = dt.datetime.now()
result = [dt_now]
for i in range(len(sp.command_line_runner())):
result.append(sp.command_line_runner()[i])
i += 1
sheet.append(result)
wb.save('speedtest_by_python.xlsx')
出力されたexcelシートが、以下。
狙い通り、1列目に日付&時間帯、2列目、3列目に下りと上りの測定結果が出力されています。
#余談
本編とは関係なく、コーディング中に行き会ったよしなきことを書きつけます。
##AttributeError: module ‘xxx’ has no attribute ‘yyy’ のエラーが出まくる
importしているspeedtestモジュールには「Speedtest」というアトリビュートがあるはずなのですが、なぜか「AttributeError: module ‘xxx’ has no attribute ‘yyy’」のエラーが出てしまいます。
原因は、「ファイル名とモジュール名が同じになっている」ことでした。今でこそ「speedtest_wifi.py」というファイル名にしていますが、エラー頻発当初は「speedtest.py」というファイル名にしていました。本来読み込みたいモジュールではなく、自分自身を読み込んでいたのですね。そりゃーエラーが出るはずだ。。
ありがとうございました!→[python]「AttributeError: module(object) ‘xxx’ has no attribute ‘yyy’」が起きたときの対処法5選
##モジュールのアトリビュートを調べる方法
上記エラーのトラシューというか横道として、「speedtestモジュールはどのようなアトリビュートを持つのか?」と思ったので、そのようなコマンドを探してみました。
まあ最初は、このために用意したファイルの名前を「inspect.py」にしていたのでまったく同じエラーが発生してしまい、想定通りの確認をできなかったのですが。。
「inspect_speedtest.py」とかにファイル名を変更してみたら、うまいこと行きました。それはそう。
ありがとうございました!→【Python】属性の一覧を取得する方法(2種類)
##if __name__ == '__main__' とは
所謂「おまじない」ですね。
if __name__ == '__main__'は「該当のファイルがコマンドラインからスクリプトとして実行された場合にのみ以降の処理を実行する」という意味となる。他のファイルからインポートされたときは処理は実行されない。
こいつ自身がcmdから指定され、動くときに、「if__name__ == '__main__'」の中身が実行される。別のファイルがこいつを呼び出す際には、中身が実行されることはない。余計な処理は発生しない。なるほど。
モジュールをインポートした際には、__name__属性にそのモジュールの名前が文字列格納されている。一方モジュールをcmdから実行すると、__name__には「__main__」という文字列が格納されている。つまり、「__name__」が「"__main__"」のときとは、モジュールがcmdから直接実行されたとき。なるほど!!
ありがとうございました!&引用元→Pythonのif __name__ == '__main__'の意味と使い方
#参考資料
・SPEEDTEST CLI Internet connection measurement for developers
・SpeedTest(スピードテスト)をコマンドからやりたい
・GitHub
・インターネット回線の速度計測(上り/下り)
・pandasでExcelファイル(xlsx, xls)の書き込み(to_excel)
・OpenPyXLでExcelファイルに書き込む その2
・[python]「AttributeError: module(object) ‘xxx’ has no attribute ‘yyy’」が起きたときの対処法5選
・【Python】属性の一覧を取得する方法(2種類)
・Pythonのif __name__ == '__main__'の意味と使い方