我的一些用户报告,当主机名包含非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中)
您需要基于主机名的唯一字符串,但其中包含Unicode字符。有多种方法可以将Unicode字符串缩减为ascii字符串,具体取决于您希望如何处理非ascii字符。这里有一个:
这将用问号替换所有非ascii字符,然后将其改为下划线(因为文件系统不喜欢文件名中的问号)。在
我不认为gethostname()一定会给您一个unicode对象。它可能是lockfile的目录名。不管怎样,其中一个是标准字符串,其中包含非ASCII(高于127)字符,另一个是unicode字符串。在
在Python模块中使用的ntjoin问题是操作系统路径在Windows上)尝试加入给定的参数。这导致Python尝试将普通字符串部分转换为unicode。在您的例子中,非unicode字符串似乎有一个非ASCII字符。这无法可靠地转换为unicode,因此Python会引发异常。在
触发问题的简单方法:
回溯显示问题所在ntpath.py. 在
您可以按照其他答案的建议,首先使用将join()的参数转换为标准字符串来解决这个问题。或者,您可以先将所有内容转换为unicode。如果为decode()指定了特定的编码,则可以将高字节转换为unicode。在
例如:
^{pr2}$是的,如果主机名或目录名是unicode字符串,则很可能会出现该错误。最好的解决方案通常是确保两者都是unicode,而不仅仅是其中一个。在
相关问题 更多 >
编程相关推荐