天天看點

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

最簡單的解決方法是:

修改計算機名為英文,然後重新開機計算機。

修改源碼解決問題請網下看。

計算機名檢視:

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

包裡的。

如果要徹底修改就涉及反編譯了。

我這裡直接對現有方法進行了改動,如果是中文計算機名,這裡直接傳回計算機名就可以了。

本來沒有域名的情況下傳回的也是計算機名,隻是針對這種中文的待域名的情況下,隻能傳回中文計算機名,這種場景比較少,而且如果我們的生産環境沒有擷取這種中文計算機名+域名的需求,這樣改動幾乎沒有影響。

Python 技術篇 - 修改源碼解決中文主機名導緻的flask、socket服務起不來問題: ‘utf-8‘ codec can‘t decode byte 0xc0 in position...

相應代碼如下:

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 服務順利起來,毫無影響。

喜歡的點個贊❤吧!