Python 技术篇 - 修改源码解决中文主机名导致的flask、socket服务起不来问题: ‘utf-8‘ codec can‘t decode byte 0xc0 in position...
由于主機名為中文導致的 flask 服務起不來,報錯如下:
File "D:\work\python3.9_64\lib\socket.py", line 791, in getfqdn
hostname, aliases, ipaddrs = gethostbyaddr(name)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc0 in position 2: invalid start byte
最簡單的解決方法是:
修改計算機名為英文,然后重啟計算機。
修改源碼解決問題請網下看。
計算機名查看:
根據報錯的位置查看文件為:
首先 getfqdn() 這個方法是為了獲取包含域名的計算機名,測試是用的英文計算機名。
Get fully qualified domain name from name.
An empty argument is interpreted as meaning the local host.
First the hostname returned by gethostbyaddr() is checked, then
possibly existing aliases. In case no FQDN is available, hostname
from gethostname() is returned.
譯文:
從名稱中獲得完全合格的域名。
空參數被解釋為表示本地主機。
首先檢查gethostbyaddr()返回的主機名,然后
可能現有的別名。如果沒有可用的FQDN,請輸入主機名
從gethostname()返回。
用英文計算機名進行測試內部方法:
>>> socket.gethostbyaddr("127.0.0.1") ('lanzao.xxx.com.cn', [], ['127.0.0.1']) >>> socket.gethostbyaddr("lanzao") ('lanzao.xxx.com.cn', [], ['fexx::a9xx:7fxx:15xx:5fxx']) >>> socket.gethostname() 'lanzao'中文情況下 gethostbyaddr() 報錯,gethostname() 不會。
gethostbyaddr() 方法是封裝在 __socket__.pyd 包里的。
如果要徹底修改就涉及反編譯了。
我這里直接對現有方法進行了改動,如果是中文計算機名,這里直接返回計算機名就可以了。
本來沒有域名的情況下返回的也是計算機名,只是針對這種中文的待域名的情況下,只能返回中文計算機名,這種場景比較少,而且如果我們的生產環境沒有獲取這種中文計算機名+域名的需求,這樣改動幾乎沒有影響。
相應代碼如下:
至此,問題解決,flask、socket 服務順利起來,毫無影響。
喜歡的點個贊?吧!
總結
以上是生活随笔為你收集整理的Python 技术篇 - 修改源码解决中文主机名导致的flask、socket服务起不来问题: ‘utf-8‘ codec can‘t decode byte 0xc0 in position...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 技术篇 - 前端浏览器发送一次
- 下一篇: Python 技术篇 - 通过pymin