Python调用netsh获取WiFi列表突发解码失败及编码适配求助
问题:获取WiFi列表时出现Unicode解码错误
背景
此前一直正常运行的WiFi列表获取代码突然报错:
result = subprocess.run("netsh wlan show network", shell=True, stdout=subprocess.PIPE, text=True, encoding="gbk")
执行时抛出GBK解码错误:
Traceback (most recent call last): File "c:\Users\Administrator\Desktop\login_jxnu\auto_connect\utils.py", line 13, in get_wifi_list result = subprocess.run("netsh wlan show network", File "D:\development\anaconda\envs\deep-todo\lib\subprocess.py", line 507, in run stdout, stderr = process.communicate(input, timeout=timeout) File "D:\development\anaconda\envs\deep-todo\lib\subprocess.py", line 1121, in communicate stdout = self.stdout.read() UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 3918: illegal multibyte sequence
将编码改为utf-8后仍报错:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbd in position 3: invalid start byte
通过chcp命令查看系统编码,返回活动代码页: 936\n(对应GBK编码),使用环境为Windows 11 + Python 3.9。
后续测试结果
将编码改为utf-8后程序恢复正常,执行以下代码的输出如下:
res = subprocess.run("chcp", shell=True, stdout=subprocess.PIPE, text=True) print(res.stdout) # 输出: Active code page: 65001 res = subprocess.run("chcp", shell=True, stdout=subprocess.PIPE, text=True, encoding='utf-8') print(res.stdout) # 输出: Active code page: 65001 res = subprocess.run("chcp", shell=True, stdout=subprocess.PIPE, text=True, encoding='gbk') print(res.stdout) # 输出: Active code page: 65001 result = subprocess.run("netsh wlan show network", shell=True, stdout=subprocess.PIPE, text=True) # 触发错误 Traceback (most recent call last): File "c:\Users\Administrator\Desktop\login_jxnu\try.py", line 4, in <module> result = subprocess.run("netsh wlan show network", File "D:\development\anaconda\envs\deep-todo\lib\subprocess.py", line 507, in run stdout, stderr = process.communicate(input, timeout=timeout) File "D:\development\anaconda\envs\deep-todo\lib\subprocess.py", line 1121, in communicate stdout = self.stdout.read() UnicodeDecodeError: 'gbk' codec can't decode byte 0xb5 in position 229: illegal multibyte sequence # 省略text=True参数 res = subprocess.run("chcp", shell=True, stdout=subprocess.PIPE) print(res.stdout) # 输出: b'Active code page: 65001\r\n'
核心疑问
- 为何原本正常的代码突然失效?
- 有哪些方法可以避免这类解码错误?
分析与解决方案
失效原因
- WiFi名称含特殊字符:周边出现了名称包含GBK/UTF-8编码无法覆盖的字符(如生僻字、emoji、其他编码字符)的WiFi,导致
netsh输出的字节流无法用单一编码完整解码。 - 代码页切换:后续测试中
chcp返回65001(UTF-8),说明当前控制台代码页被修改(可能由其他程序、系统更新或手动设置导致),但subprocess默认继承的编码与实际输出编码不匹配,引发解码冲突。
解决方法
- 读取字节流后兼容处理:不指定
text=True和encoding,先获取原始字节数据,再尝试多种编码解码,忽略无效字符:
result = subprocess.run("netsh wlan show network", shell=True, stdout=subprocess.PIPE) # 优先尝试UTF-8,失败则用GBK,忽略无法解码的字符 try: output = result.stdout.decode('utf-8', errors='ignore') except: output = result.stdout.decode('gbk', errors='ignore')
- 强制切换代码页到UTF-8:执行
netsh前先切换控制台代码页为65001,确保输出为UTF-8编码:
# 先切换代码页到UTF-8,屏蔽输出避免干扰 subprocess.run("chcp 65001", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 用UTF-8编码读取netsh输出 result = subprocess.run("netsh wlan show network", shell=True, stdout=subprocess.PIPE, text=True, encoding="utf-8")
- 替换无效字符而非忽略:如果不想丢失字符,用
errors='replace'将无法解码的字节替换为占位符:
result = subprocess.run("netsh wlan show network", shell=True, stdout=subprocess.PIPE, text=True, encoding="gbk", errors="replace")
内容的提问来源于stack exchange,提问作者idea steps
相关产品推荐
相关产品推荐

