Ubuntu加密主目录 | Errno 36 文件名过长

2 投票
3 回答
6455 浏览
提问于 2025-04-17 15:57

我在做一个用Python写的爬虫,遇到了一个网址,它的字符数超过了限制,导致出现了一个叫IOError的错误。我在用httplib2这个库,当我尝试获取这个网址时,出现了“文件名太长”的错误。我希望我的所有项目都放在主目录下,因为我在用Dropbox。请问有没有解决这个问题的方法,或者我应该把工作目录设置在主目录外面呢?

3 个回答

2

看起来你在创建 httplib.Http 对象的时候用了 '.cache',你应该把这个改成更合适的选项,或者直接关闭缓存功能。

6

你可能遇到了加密文件系统的限制,这个系统对文件名的长度最多只能支持143个字符。

这里有个相关的bug:

https://bugs.launchpad.net/ecryptfs/+bug/344878

目前的解决办法是使用加密的主目录以外的其他目录。为了确认这一点,你可以:

mount | grep ecryptfs

看看你的主目录是否在列表中。如果是这样的话,你可以选择在主目录上面的其他目录,或者创建一个新的主目录,但不要使用加密。

2

文件名太长的问题是因为它以 '.cache/www.example.com' 开头。

httplib2 这个库可以选择性地缓存你发出的请求。你开启了缓存功能,并把缓存目录设置为 .cache

解决这个问题的简单办法就是把缓存目录放到别的地方。

如果不看你的代码,就没办法告诉你具体怎么修复。不过这应该很简单。关于 FileCache 的文档说明,它的第一个参数是 dir_name,也就是你可以指定的目录名。

另外,你还可以传一个 safe 函数,这样你就可以根据 URI 生成文件名,覆盖默认的文件名。这可以帮助你生成符合 Ubuntu 加密文件系统 144 字符限制的文件名。

还有一种方法是自己创建一个和 FileCache 接口相同的对象,然后把它传给 Http 对象用作缓存。比如,你可以用 tempfile 来生成随机文件名,并在 anydbmsqlite3 数据库中存储 URL 和文件名的对应关系。

最后一个选择当然就是直接关闭缓存功能。

撰写回答