Pingsは、Pythonでネットワーク接続性を確認するためのシンプルで便利なライブラリです。ICMP(Internet Control Message Protocol)を使用して、指定したホストへの到達性を確認し、遅延時間(ラウンドトリップタイム)を測定します。ネットワークのトラブルシューティングやパフォーマンス監視に役立ちます。以下に、Pingsの特徴と実用例を説明します。
Pingsの特徴
簡単な使用方法
Pingsは使いやすいAPIを提供しており、わずかなコードでホストの到達性を確認できます。
ICMPプロトコルの使用
ICMPエコーリクエスト(ping)を送信し、応答時間を測定します。これにより、ネットワークの遅延を簡単に確認できます。
詳細な応答情報
応答時間、タイムアウト、パケットの損失率など、詳細な情報を取得できます。
クロスプラットフォーム
PingsはWindows、macOS、Linuxなど、さまざまなプラットフォームで動作します。
インストール
まず、pingsを使用するには、ライブラリをインストールする必要があります。以下のコマンドを使用します:
pip install pings
例題1: 基本的なpingの実行
まず、Pingsを使用して基本的なpingを実行する方法を示します。
import pings
# Pingsのインスタンスを作成
p = pings.Ping()
# ホストにpingを送信
response = p.ping('8.8.8.8')
# 結果を表示
if response.is_reached():
print(f"Ping成功: {response.avg_rtt} ms")
else:
print("Ping失敗")
このコードでは、GoogleのパブリックDNSサーバー(8.8.8.8)に対してpingを送信し、応答時間を表示します。response.is_reached()
でホストへの到達性を確認し、応答があれば平均ラウンドトリップタイム(avg_rtt)を表示します。
Macでエラーになる場合
スクリプトを管理者権限で実行する: Pingsは低レベルのネットワークアクセスを必要とするため、管理者権限でスクリプトを実行する必要があります。以下のようにスクリプトを実行してください
sudo python (コード名).py
Windowsでエラーになる場合
timer = time.clock
^^^^^^^^^^
このエラーは、pings
ライブラリ内で使用されている time.clock
が原因です。time.clock
は、Python 3.8 以降で削除されました。そのため、Python 3.8 以上のバージョンを使用している場合、このエラーが発生します。
解決方法
pings
ライブラリのコードを修正するか、ライブラリが公式に対応していない場合は、別の手段で time.clock
を適切な方法に置き換える必要があります。
修正方法
ping.py
内の time.clock
の置き換え:
time.clock
をtime.perf_counter
に置き換えます。time.perf_counter
は、クロックの精度が高く、time.clock
の代替として推奨されています。
C:\Users\{PC毎の設定}\AppData\Local\Programs\Python\Python312\Lib\site-packages\pings\ping.py
をテキストエディタで開きます。time.clock
の部分をtime.perf_counter
に置き換えます。
具体的なコードの例
以下は、修正後の ping.py
内の一部のコード例です:
import time
# 元のコード
# timer = time.clock
# 修正後のコード
timer = time.perf_counter
補足
- もしライブラリを手動で修正するのに抵抗がある場合、
pings
ライブラリの代わりに他のサードパーティ製のPingライブラリを探すか、ライブラリ作者が提供する修正版のリリースを待つことも検討してください。 - Pythonのバージョンを古いものにダウングレードすることも可能ですが、セキュリティや機能面でのリスクがあるため、あまり推奨されません。
例題2: 複数回のpingの実行
次に、Pingsを使用して複数回のpingを実行し、結果を集計する方法を示します。
import pings
# Pingsのインスタンスを作成
p = pings.Ping()
# ホストに複数回pingを送信
response_list = []
for i in range(5):
response = p.ping('8.8.8.8')
response_list.append(response.avg_rtt)
# 結果を表示
for i, rtt in enumerate(response_list):
if rtt is not None:
print(f"Ping {i+1}: {rtt} ms")
else:
print(f"Ping {i+1}: 失敗")
このコードでは、5回のpingを連続して送信し、それぞれの応答時間を表示しています。各pingの応答時間をリストに追加し、結果を集計しています。
例題3: タイムアウトとエラーのハンドリング
次に、pingのタイムアウトやエラーをハンドリングする方法を示します。
import pings
# Pingsのインスタンスを作成
p = pings.Ping()
# ホストにpingを送信
try:
response = p.ping('8.8.8.8', timeout=2000) # タイムアウトを2秒に設定
if response.is_reached():
print(f"Ping成功: {response.avg_rtt} ms")
else:
print("Ping失敗: タイムアウト")
except Exception as e:
print(f"Ping失敗: {e}")
このコードでは、pingのタイムアウトを2秒に設定し、応答がない場合はタイムアウトエラーを表示します。例外処理を追加して、エラーが発生した場合に適切にハンドリングしています。
例題4: 詳細なping応答の解析
最後に、詳細なping応答情報を解析し、表示する方法を示します。
import pings
# Pingsのインスタンスを作成
p = pings.Ping()
# 送信するpingの回数
ping_count = 10
# 応答時間を保存するリスト
rtt_list = []
# 複数回pingを送信して結果を保存
for i in range(ping_count):
response = p.ping('8.8.8.8')
if response.is_reached():
rtt_list.append(float(response.avg_rtt))
print(f"Ping {i+1} 成功: 応答時間 {response.avg_rtt} ms")
else:
print(f"Ping {i+1} 失敗")
# 統計の計算
if rtt_list:
max_rtt = max(rtt_list)
min_rtt = min(rtt_list)
avg_rtt = sum(rtt_list) / len(rtt_list)
successful_pings = len(rtt_list)
print(f"\n統計情報:")
print(f" 最大応答時間: {max_rtt} ms")
print(f" 最小応答時間: {min_rtt} ms")
print(f" 平均応答時間: {avg_rtt} ms")
print(f" 成功した応答回数: {successful_pings}")
print(f" 失敗した応答回数: {ping_count - successful_pings}")
else:
print("すべてのPingに失敗しました。")
このコードでは、ping応答の最大、最小、平均応答時間、およびパケット損失数を表示しています。response.max_rtt
、response.min_rtt
、response.avg_rtt
、およびresponse.packet_lost
を使用して詳細な応答情報を取得します。
結論
Pingsは、Pythonでネットワーク接続性を簡単に確認するための強力なライブラリです。シンプルなインターフェースでICMPエコーリクエストを送信し、応答時間や接続性を測定できます。基本的なpingの実行から、複数回のping、タイムアウトやエラーのハンドリング、詳細な応答情報の解析まで、多岐にわたる機能を提供しています。Pingsを活用することで、ネットワークのパフォーマンスを定量的に評価し、トラブルシューティングやネットワーク監視を効果的に行うことができます。