Pings:Pythonでネットワーク接続性を確認するライブラリ

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.clocktime.perf_counter に置き換えます。time.perf_counter は、クロックの精度が高く、time.clock の代替として推奨されています。
手順:
  1. C:\Users\{PC毎の設定}\AppData\Local\Programs\Python\Python312\Lib\site-packages\pings\ping.py をテキストエディタで開きます。
  2. 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_rttresponse.min_rttresponse.avg_rtt、およびresponse.packet_lostを使用して詳細な応答情報を取得します。

結論

Pingsは、Pythonでネットワーク接続性を簡単に確認するための強力なライブラリです。シンプルなインターフェースでICMPエコーリクエストを送信し、応答時間や接続性を測定できます。基本的なpingの実行から、複数回のping、タイムアウトやエラーのハンドリング、詳細な応答情報の解析まで、多岐にわたる機能を提供しています。Pingsを活用することで、ネットワークのパフォーマンスを定量的に評価し、トラブルシューティングやネットワーク監視を効果的に行うことができます。

タイトルとURLをコピーしました