django fcgi 似乎改变了 python 库的行为

django fcgi seems to change the behavior of the python library

我正在尝试遍历目录树,return如果我找到任何特定类型的文件,则为真:

for dirpath, dirnames, filenames in os.walk(location):
  for f in filenames:
    if fn.endswith(".eml") or fn.endswith(".zip"):
      return True

这始终在远程系统的挂载点内工作。 NFS 挂载从未显示出问题。

我们最近有人做了一个 CIFS 挂载,其中一个文件名包含一个 \xc2\xb9 字符(上标一个)。在这种情况下,我们得到了回溯:

  for dirpath, dirnames, filenames in os.walk(location):
File "/usr/lib64/python2.6/os.py", line 294, in walk
  for x in walk(path, topdown, onerror, followlinks):
File "/usr/lib64/python2.6/os.py", line 284, in walk
  if isdir(join(top, name)):
File "/usr/lib64/python2.6/posixpath.py", line 70, in join
  path += '/' + b
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 23: ordinal not in range(128)

现在,问题来了:这只发生在代码在 FCGI 中执行时。我可以 运行 在同一棵树上作为独立程序使用相同的代码,并且没有回溯。除了 "Don't use os.walk()"?

之外还有什么建议吗?

免责声明:我们使用的是旧版本的 Django。我无法改变这一点。

问题似乎是 os.walk 被赋予了一个 unicode 对象,因此 path += ... 操作试图在附加它们之前将来自 listdir 调用的字符串转换为 unicode到路径。 Django 与控制台的区别可能是因为来自 Django 的参数(查询参数、url 部分等)是 unicode,而作为参数从 CLI 传递的字符串是实际的字符串对象。

解决此问题的方法是将 location.encode('utf-8') 传递给 os.walk,这应该会阻止 python 尝试将目录内容转换为 unicode 对象。