如何结合executor使用pythonping 树莓派下无需root获取ICMP ping结果
基于executor.Communicator的可运行实现
from executor import Communicator import json def get_ping_average(target_ip: str, ping_count: int = 10, packet_size: int = 40) -> float | None: # 构造sudo执行的Python命令,内嵌pythonping调用逻辑 run_cmd = [ "sudo", "python3", "-c", f""" from pythonping import ping import json ping_result = ping('{target_ip}', count={ping_count}, size={packet_size}, timeout=2) print(json.dumps({{'rtt_avg': ping_result.rtt_avg_ms, 'is_success': ping_result.success(2)}})) """ ] # 通过Communicator执行命令 comm = Communicator(run_cmd, capture=True) comm.run() if not comm.succeeded: return None # 解析返回的ping结果 result_data = json.loads(comm.output.strip()) return result_data['rtt_avg'] if result_data['is_success'] else None # 测试调用 if __name__ == "__main__": avg_rtt = get_ping_average("1.1.1.1", 10, 40) if avg_rtt: print(f"10次ping平均响应时间:{avg_rtt} ms") else: print("ping执行失败,请检查网络或权限配置")
前置配置说明
- 若要实现pi用户无密码运行,可执行
sudo visudo编辑权限配置,在文件末尾添加:
保存后即可无需输入sudo密码直接运行脚本。pi ALL=(ALL) NOPASSWD: /usr/bin/python3 - 无需executor的替代方案:直接给Python解释器授予ICMP所需的raw socket权限,执行命令:
配置完成后可以直接调用pythonping的sudo setcap cap_net_raw+ep /usr/bin/python3ping()方法,不需要root权限,也不需要引入executor依赖。
内容的提问来源于stack exchange,提问作者Shawn
相关产品推荐
相关产品推荐

