使用时发生UnicodeDecodeError套接字.gethostname()结果

2024-04-18 22:49:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我的一些用户报告,当主机名包含非ascii字符时,以下代码可能会引发UnicodeDecodeError(但我无法在我的Windows Vista计算机上复制此错误):

    self.path = path
    self.lock_file = os.path.abspath(path) + ".lock"
    self.hostname = socket.gethostname()
    self.pid = os.getpid()
    dirname = os.path.dirname(self.lock_file)
    self.unique_name = os.path.join(dirname, "%s.%s" % (self.hostname, self.pid))

回溯的最后一部分是:

^{pr2}$

有什么想法可以解释为什么和如何预防?在

(例外情况发生在Windows XP上的Python2.5中)


Tags: path代码用户selflockoswindows报告
3条回答

您需要基于主机名的唯一字符串,但其中包含Unicode字符。有多种方法可以将Unicode字符串缩减为ascii字符串,具体取决于您希望如何处理非ascii字符。这里有一个:

self.hostname = socket.gethostname().encode('ascii', 'replace').replace('?', '_')

这将用问号替换所有非ascii字符,然后将其改为下划线(因为文件系统不喜欢文件名中的问号)。在

我不认为gethostname()一定会给您一个unicode对象。它可能是lockfile的目录名。不管怎样,其中一个是标准字符串,其中包含非ASCII(高于127)字符,另一个是unicode字符串。在

在Python模块中使用的ntjoin问题是操作系统路径在Windows上)尝试加入给定的参数。这导致Python尝试将普通字符串部分转换为unicode。在您的例子中,非unicode字符串似乎有一个非ASCII字符。这无法可靠地转换为unicode,因此Python会引发异常。在

触发问题的简单方法:

>> from ntpath import join
>> join(u'abc', '\xff')
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)

/home/msmits/<ipython console> in <module>()

/usr/lib64/python2.6/ntpath.pyc in join(a, *p)
    106                     path += b
    107                 else:
--> 108                     path += "\\" + b
    109             else:
    110                 # path is not empty and does not end with a backslash,

回溯显示问题所在ntpath.py. 在

您可以按照其他答案的建议,首先使用将join()的参数转换为标准字符串来解决这个问题。或者,您可以先将所有内容转换为unicode。如果为decode()指定了特定的编码,则可以将高字节转换为unicode。在

例如:

^{pr2}$

是的,如果主机名或目录名是unicode字符串,则很可能会出现该错误。最好的解决方案通常是确保两者都是unicode,而不仅仅是其中一个。在

相关问题 更多 >