前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 技术篇 - 修改源码解决中文主机名导致的flask、socket服务起不来问题: ‘utf-8‘ codec can‘t decode byte 0xc0 in position...

Python 技术篇 - 修改源码解决中文主机名导致的flask、socket服务起不来问题: ‘utf-8‘ codec can‘t decode byte 0xc0 in position...

作者头像
小蓝枣
发布2021-12-01 10:34:04
8020
发布2021-12-01 10:34:04
举报
文章被收录于专栏:CSDN博客专家-小蓝枣的博客

由于主机名为中文导致的 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() 这个方法是为了获取包含域名的计算机名,测试是用的英文计算机名。

代码语言:javascript
复制
>>> import socket
>>> socket.getfqdn("127.0.0.1")
'lanzao.xxx.com.cn'

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()返回。

用英文计算机名进行测试内部方法:

代码语言:javascript
复制
>>> 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 包里的。 如果要彻底修改就涉及反编译了。

我这里直接对现有方法进行了改动,如果是中文计算机名,这里直接返回计算机名就可以了。 本来没有域名的情况下返回的也是计算机名,只是针对这种中文的待域名的情况下,只能返回中文计算机名,这种场景比较少,而且如果我们的生产环境没有获取这种中文计算机名+域名的需求,这样改动几乎没有影响。

在这里插入图片描述
在这里插入图片描述

相应代码如下:

代码语言:javascript
复制
def getfqdn(name=''):
    """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.
    """
    try:
        name = name.strip()
        if not name or name == '0.0.0.0':
            name = gethostname()
        try:
            hostname, aliases, ipaddrs = gethostbyaddr(name)
        except error:
            pass
        else:
            aliases.insert(0, hostname)
            for name in aliases:
                if '.' in name:
                    break
            else:
                name = hostname
        return name
    except Exception as e:
        print(e)
        return gethostname()   # 仅返回计算机名,无域名

至此,问题解决,flask、socket 服务顺利起来,毫无影响。 喜欢的点个赞❤吧!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/08/16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档