使用Python subprocess执行netsh wlan命令时遇UnicodeDecodeError的解决求助
解决Windows下subprocess执行netsh命令的编码错误问题
遇到的UnicodeDecodeError是因为Windows命令行(cmd)的默认编码不是UTF-8,而是GBK(对应代码页CP936),netsh命令的输出用这个编码,用UTF-8解码自然会失败。下面是几个可行的解决办法:
方法一:指定正确的编码(最直接)
直接将subprocess.run的encoding参数设为gbk或cp936(两者等价):
import subprocess command = 'netsh wlan show profiles' network_list = subprocess.run(command, shell=True, capture_output=True, text=True, encoding='gbk') networks = network_list.stdout print(networks)
方法二:捕获字节输出后容错解码
如果不确定编码,先获取原始字节数据,再尝试解码,遇到错误时忽略或替换无效字符:
import subprocess command = 'netsh wlan show profiles' network_list = subprocess.run(command, shell=True, capture_output=True) # 优先尝试GBK解码,失败则用UTF-8忽略错误字符 try: networks = network_list.stdout.decode('gbk') except UnicodeDecodeError: networks = network_list.stdout.decode('utf-8', errors='ignore') print(networks)
方法三:先切换命令行编码为UTF-8
通过chcp 65001将控制台编码切换为UTF-8,再执行netsh命令,之后就能用UTF-8解码:
import subprocess command = 'chcp 65001 && netsh wlan show profiles' network_list = subprocess.run(command, shell=True, capture_output=True, text=True, encoding='utf-8') networks = network_list.stdout # 移除开头的编码切换提示行 networks = '\n'.join(line for line in networks.split('\n') if not line.startswith('Active code page:')) print(networks)
注:你之前尝试的
utf-16不适用,因为它是双字节编码,而netsh输出是单字节的GBK编码,强行用UTF-16解码只会导致更多错误。
内容的提问来源于stack exchange,提问作者Selim
相关产品推荐
相关产品推荐

