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...

由于主机名为中文导致的 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

最简单的解决方法是:

修改计算机名为英文,然后重启计算机。

修改源码解决问题请网下看。

计算机名查看:

image.png

根据报错的位置查看文件为:

image.png

首先 getfqdn() 这个方法是为了获取包含域名的计算机名,测试是用的英文计算机名。

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

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

>>> 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 包里的。

如果要彻底修改就涉及反编译了。

我这里直接对现有方法进行了改动,如果是中文计算机名,这里直接返回计算机名就可以了。

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

image.png

相应代码如下:

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 服务顺利起来,毫无影响。

喜欢的点个赞❤吧!

目录
相关文章
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
558 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
JSON 数据格式 Python
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
594 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
|
Kubernetes 网络协议 Python
Python网络编程:从Socket到Web应用
在信息时代,网络编程是软件开发的重要组成部分。Python作为多用途编程语言,提供了从Socket编程到Web应用开发的强大支持。本文将从基础的Socket编程入手,逐步深入到复杂的Web应用开发,涵盖Flask、Django等框架的应用,以及异步Web编程和微服务架构。通过本文,读者将全面了解Python在网络编程领域的应用。
190 1
|
消息中间件 监控 网络协议
Python中的Socket魔法:如何利用socket模块构建强大的网络通信
本文介绍了Python的`socket`模块,讲解了其基本概念、语法和使用方法。通过简单的TCP服务器和客户端示例,展示了如何创建、绑定、监听、接受连接及发送/接收数据。进一步探讨了多用户聊天室的实现,并介绍了非阻塞IO和多路复用技术以提高并发处理能力。最后,讨论了`socket`模块在现代网络编程中的应用及其与其他通信方式的关系。
980 3
|
安全 网络协议 网络安全
Python Socket编程大揭秘:从菜鸟到黑客的进阶之路,你准备好了吗?
【10月更文挑战第4天】在编程领域,Python Socket编程犹如一把开启网络世界的钥匙,带领开发者从简单数据传输迈向复杂应用构建。本文将引导你从零开始,逐步掌握Socket编程的核心技巧,包括基本概念、TCP服务器与客户端的搭建、并发处理及异常管理、SSL/TLS加密通信,直至深入了解网络协议与安全漏洞。通过实战演练与理论学习,助你成为驾驭网络世界的高手。
138 1
|
存储 网络协议 Linux
聊一聊 Python 的 socket,以及 select、poll、epoll 又是怎么一回事?
聊一聊 Python 的 socket,以及 select、poll、epoll 又是怎么一回事?
700 2
|
监控 网络协议 数据库连接
Python3 监控端口:使用 socket 库
Python3 监控端口:使用 socket 库
217 1
|
网络协议 开发者 Python
网络编程小白秒变大咖!Python Socket基础与进阶教程,轻松上手无压力!
在网络技术飞速发展的今天,掌握网络编程已成为开发者的重要技能。本文以Python为工具,带你从Socket编程基础逐步深入至进阶领域。首先介绍Socket的概念及TCP/UDP协议,接着演示如何用Python创建、绑定、监听Socket,实现数据收发;最后通过构建简单的聊天服务器,巩固所学知识。让初学者也能迅速上手,成为网络编程高手。
236 1
|
网络协议 测试技术 网络安全
Python编程-Socket网络编程
Python编程-Socket网络编程
144 0
|
监控 网络协议 数据库连接
Python3 监控端口:使用 socket 库
Python3 监控端口:使用 socket 库
160 0

推荐镜像

更多