我的一些用户报告,当主机名包含非 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))
回溯的最后一部分是:
File "taskcoachlib\thirdparty\lockfile\lockfile.pyo", line 537, in FileLock
File "taskcoachlib\thirdparty\lockfile\lockfile.pyo", line 296, in __init__
File "taskcoachlib\thirdparty\lockfile\lockfile.pyo", line 175, in __init__
File "ntpath.pyo", line 102, in join
UnicodeDecodeError: 'ascii' codec can't decode byte 0xcf in position 7: ordinal not in range(128)
关于为什么以及如何预防它有什么想法吗?
(Windows XP 上的 Python 2.5 出现异常)
最佳答案
我不认为 gethostname() 一定会给你一个 unicode 对象。它可能是锁定文件的目录名称。无论如何,其中一个是包含非 ASCII(高于 127)字符的标准字符串,另一个是 unicode 字符串。
问题在于 ntpath 模块(Python 在 Windows 上用于 os.path 的模块)中的 join 函数尝试连接给定的参数。这会导致 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。
例如:
>> '\xff'.decode('latin-1')
u'\xff'
关于python - 使用 socket.gethostname() 结果时出现 UnicodeDecodeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1290601/