基于Kalle Hallden思路的WiFi设备连接提醒Python脚本报错求助
解决
decouple.UndefinedValueError: IP_NETWORK not found报错,让WiFi设备接入检测脚本正常运行 问题背景
我从Kalle Hallden的视频里学到一个有趣的思路:写个Python脚本,当特定IP的设备接入WiFi时发出提醒。我写的代码如下:
import sys import subprocess import os from decouple import config IP_NETWORK = config('IP_NETWORK') IP_DEVICE = config('IP_DEVICE') proc = subprocess.Popen(["ping", IP_NETWORK],stdout=subprocess.PIPE) while True: line = proc.stdout.readline() if not line: break #the real code does filtering here connected_ip = line.decode('utf-8').split()[3] if connected_ip == IP_DEVICE: subprocess.Popen(["say", "Linnea just connected to the network"])
运行时却抛出了这个错误:
Error Traceback (most recent call last): File "C:\Users\utkar\Downloads\net-listen.py", line 6, in <module> IP_NETWORK = config('IP_NETWORK') File "C:\Users\utkar\AppData\Local\Programs\Python\Python38-32\lib\site-packages\decouple.py", line 199, in __call__ return self.config(*args, **kwargs) File "C:\Users\utkar\AppData\Local\Programs\Python\Python38-32\lib\site-packages\decouple.py", line 83, in __call__ return self.get(*args, **kwargs) File "C:\Users\utkar\AppData\Local\Programs\Python\Python38-32\lib\site-packages\decouple.py", line 68, in get raise UndefinedValueError('{} not found. Declare it as envvar or define a default value.'.format(option)) decouple.UndefinedValueError: IP_NETWORK not found. Declare it as envvar or define a default value. Process returned 1 (0x1) execution time : 0.150 s Press any key to continue . . .
解决方案
这个报错的核心原因是python-decouple库的config()函数找不到你定义的IP_NETWORK和IP_DEVICE配置项——它默认会从环境变量或者项目根目录的.env文件里读取这些值。下面给你三种可行的解决方法:
方法1:创建.env配置文件(推荐,持久化且灵活)
- 在你的脚本
net-listen.py所在的文件夹里,新建一个名为.env的文件(Windows下创建时,手动输入文件名要加引号,比如.env,避免系统自动添加后缀) - 在
.env文件里写入你的实际IP配置,格式是键=值,不要加引号:
IP_NETWORK=192.168.1.1 # 替换成你的WiFi网关IP或者要ping的目标地址 IP_DEVICE=192.168.1.100 # 替换成你要检测的设备IP
- 保存文件后重新运行脚本即可。
方法2:临时设置环境变量(适合快速测试)
如果你不想创建.env文件,可以直接在运行脚本前,在终端/命令行里设置环境变量:
- Windows命令行:
set IP_NETWORK=192.168.1.1 set IP_DEVICE=192.168.1.100 python net-listen.py
- Linux/macOS终端:
export IP_NETWORK=192.168.1.1 export IP_DEVICE=192.168.1.100 python3 net-listen.py
注意:这种方式的环境变量是临时的,关闭终端后就会失效。
方法3:给config()函数添加默认值(应急用,不推荐长期使用)
如果你只是想快速让脚本跑起来,可以直接给config()函数加default参数,硬编码你的IP:
IP_NETWORK = config('IP_NETWORK', default='192.168.1.1') IP_DEVICE = config('IP_DEVICE', default='192.168.1.100')
不过这种方式把配置写死在代码里,后续修改IP需要改代码,不如前两种方法灵活。
额外优化建议:解决跨平台ping输出解析问题
原脚本里用split()[3]提取IP的方式,在Windows和Linux/macOS下可能不通用——因为不同系统的ping命令输出格式不一样,比如Windows的ping输出里,IP的位置是split()[2]。你可以用正则表达式来更可靠地提取IP,替换原脚本里的IP解析部分:
import re # 记得在开头导入re库 while True: line = proc.stdout.readline() if not line: break line_str = line.decode('utf-8') # 用正则匹配IP地址 ip_match = re.search(r'\b(?:\d{1,3}\.){3}\d{1,3}\b', line_str) if ip_match: connected_ip = ip_match.group() if connected_ip == IP_DEVICE: subprocess.Popen(["say", "Linnea just connected to the network"])
这样不管是Windows还是Unix系统,都能正确提取到ping输出里的IP地址。
内容的提问来源于stack exchange,提问作者Utkarsh Trivedi
相关产品推荐
相关产品推荐

