为什么说程序员重命名时电脑不要带中文?记一次python manage.py runserver时UnicodeDecodeError的原因与解决方案

运行环境:

Win11系统,Anaconda Prompt,名为'rango'的虚拟环境,Edge浏览器。


问题描述

最近在根据《Tango with Django》这本书学习Django,结果在Anaconda黑窗口启用虚拟环境运行python manage.py runserver命令时意外报了 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcc in position 8: invalid continuation byte的错误。该错误在重建 Django 项目、重新创建虚拟环境后仍然稳定复现,说明问题不在项目代码层面。

完整黑窗口命令以及报错记录如下:(JerryKing是我windows的本地用户名,Workspace是我练习django的文件夹,有类似情况的朋友路径应该是C:\Users\<你的username>\<你的workspace>)

复制代码

原因分析:

从上面图中 traceback 的最底部几行可以定位到关键调用链:

HTTPServer.server_bind(self)--socket.getfqdn(host)--socket.gethostbyaddr(name)

还有经常与中文字符问题相关的'utf-8'字样。

找到socket.py中的getfqdn(),本例中的name应该是127.0.0.1

错误就发生在这一行。

在 Windows 系统上,socket.gethostbyaddr() 会通过系统 API 反向解析本机 IP 地址,并返回当前电脑的 hostname(主机名)。

当调用 gethostbyaddr('127.0.0.1') 时,Windows 网络栈将该地址识别为本机回环地址 ,并返回当前主机名。

由于 Windows 返回的主机名使用本地编码(如 GBK),而 Python 标准库在接收该返回值时假定其为 UTF-8 编码,导致在解码阶段抛出 UnicodeDecodeError(Python 甚至"没来得及"成功给 hostname 赋值)。

而本人前几日在Windows的设置-系统中对电脑进行过重命名操作,且包含中文!

这就解释了为何会有UnicodeDecodeError但报错信息中未直接出现中文。


解决方案:

在Windows的设置-系统中对电脑进行重命名操作,且重命名后的主机名不能包含中文(即使windows允许你这么做)。重命名后重启电脑即可。

其他的碎碎念:

刚发现这个问题的时候,我实际上是直接把trackback丢给某知名国际GenAI了,但是其回复的方案是修改命令为python manage.py runserver 127.0.0.1:8000或者python manage.py runserver localhost:8000,但是都没用,问了四五遍还是在讲车轱辘话,再加上重新敲安装命令+反复测试又浪费了人生宝贵的30min。最后不得不动用脑细胞去看报错信息,找到对应的代码,然后又联想到前几日进系统设置修改过主机名,还带了中文字符,这才反应过来,实测修改为不含中文的主机名后就没有报错了。

这次经历我觉得有意义/有趣的一个地方在于,这个错误是由于一个看似不起眼的"局外"因素导致的------带有中文字符的主机名居然会导致runserver失败。这跟我平时"代码报错那肯定是代码哪里写错了"+"带utf-8的报错肯定是代码文件里带了中文导致的"的经验与思维惯性不同,这次代码文件没有任何问题,文件中也不含任何中文字符,但是还是出现了UTF-8解码错误,追根溯源竟然是主机名中的中文影响了程序的正常运行,而我也仅仅是前几天心血来潮才会去修改主机名(我猜大多数用户都不会这么做吧?),过了一阵子就导致了这么严重的后果。(假如这是我打开了辛苦编程了多日的网页项目,结果因为不明原因倒在了runserver这一步,因为看见了熟悉的utf8就想当然地去给所有代码文件都加了防止编码问题的代码,结果还是出问题然后心态崩溃+浪费大量精力时间balabalabala。)

另外还有一点我觉得这次经历是一个教训,我自己偷懒去问GenAI,但是被GenAI带偏后不自知还花大量时间做了很多无用功。而实际上当我开始动脑去找代码,看具体程序流,再到解决问题也就花了5分钟。把这当作一个教训,继续学习吧。

相关推荐
神鹰手哥_起飞版9 分钟前
深度研判任务里,开思考、换更强的模型、套方法论,哪个更有用?
人工智能
ObserverX2113 分钟前
我是如何用 13KB 纯 Python,发现本地 RAG 的“隐式递归记忆”的
人工智能
Jason_gao99914 分钟前
Github Copilot 新手极速上手指南
人工智能·github·copilot
用户3600555790015 分钟前
Kestrel_VLLM - 35 · 把 m 循环搬进内核:一次「先量发射、再合并发射」的完整回合
人工智能
Linye15 分钟前
为什么让 AI 修个小 Bug 却把底层全重写了?聊聊 Coding Agent 的最小修改边界
人工智能·架构
starrysky81016 分钟前
zipfile 中文乱码修复:把已知 GBK 旧 ZIP 解压到正确中文目录
python
深度开源22 分钟前
我扫了自己电脑里的 402 个 AI 技能,光目录就吃掉 4.5 万 token
人工智能
skywalk816323 分钟前
hive 常驻集群:像 OSPF 一样在线,像 git 一样可信
运维·人工智能·hive
王中阳Go23 分钟前
你那条三跳链路的单跳超时,是按压测的 p95 定的,还是拍出来的?
人工智能·后端·架构
方方洛24 分钟前
ray教程-27-附录F-RayClient与runtime_env与多语言
人工智能·分布式·机器学习