【问题标题】:django fcgi seems to change the behavior of the python librarydjango fcgi 似乎改变了 python 库的行为
【发布时间】:2015-06-25 17:31:28
【问题描述】:

我正在尝试遍历目录树并在找到任何特定类型的文件时返回 true:

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 中执行时。我可以作为独立程序在同一棵树上运行相同的代码,并且没有回溯。除了“不要使用 os.walk()”之外还有什么建议吗?

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

【问题讨论】:

  • 你能检查一下sys.getdefaultencoding()的值,看看它在fcgi的情况下是否不同?另请注意,python 2.6 自 2013 年起停产(您可能也无法更改,但有参数会有所帮助)。
  • 我怀疑这与 django 有关。您没有使用 终端 来运行它,这更相关。
  • sys.getdefaultencoding() 在这两种情况下都是 'ascii'。
  • 还检查了 sys.getfilesystemencoding()。在这两种情况下都是“ANSI_X3.4-1968”。

标签: python django fastcgi os.walk


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2012-10-10
    • 2023-03-16
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 2022-01-20
    • 2020-10-15
    相关资源
    最近更新 更多