You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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配置文件(推荐,持久化且灵活)

  1. 在你的脚本net-listen.py所在的文件夹里,新建一个名为.env的文件(Windows下创建时,手动输入文件名要加引号,比如.env,避免系统自动添加后缀)
  2. 在.env文件里写入你的实际IP配置,格式是键=值,不要加引号:
IP_NETWORK=192.168.1.1  # 替换成你的WiFi网关IP或者要ping的目标地址
IP_DEVICE=192.168.1.100 # 替换成你要检测的设备IP
  1. 保存文件后重新运行脚本即可。

方法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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 20:02:52