Python:最大递归深度

时间:2011-08-29 00:51:27

标签: python recursion

下面给出了一个函数,用于返回其参数大小的总和,可以是单个文件/目录或文件/目录列表。代码给出了错误消息RuntimeError: maximum recursion depth exceeded while calling a Python object但是我尝试测试它。

如何解决这个问题?

由于

苏雷什

#!/usr/bin/python3.1
import os

def fileSizes(f):
    if hasattr(f,'__iter__'):
        return sum(filter(fileSizes,f))
    if os.path.isfile(f):
        return os.path.getsize(f)
    elif os.path.isdir(f):
        total_size = os.path.getsize(f)
        for item in os.listdir(f):
            total_size += fileSizes(os.path.join(f, item))
        return total_size

4 个答案:

答案 0 :(得分:8)

使用内置的os.walk (Documentation)方法,而不是编写自己的adhoc目录 - 横向方法。

事实上,文档中的示例(上面的链接)计算了非目录文件的总大小。

答案 1 :(得分:2)

上次检查时,默认的最大递归深度为1000.您有几个选项:

  1. 使用Stackless Python不强制递归限制(允许无限递归)。
  2. 以迭代样式重写您的函数而不是递归,因此您不会首先溢出堆栈。
  3. 使用sys.setrecursionlimit设置最大递归限制。请注意,如果滥用,可能会导致分段错误。

答案 2 :(得分:1)

有许多技巧可以避免深度递归问题,但我怀疑这不是你的核心问题。 (也许是因为你有非常深的目录结构..所以首先在浅层目录上进行测试。)

我猜你在链接引起的目录树中找到了一个循环结构。 即符号链接目录,指向父目录。 (这种结构并不罕见)。

通过在跟踪目录之前检查目录是否为符号链接,可以避免无限循环。

另一个可能性就是你得到了“。”或“..”在您的列表中的某个地方。这些也会产生无限循环。我没有看到这里发生的事情,但值得思考。 os.listdir似乎没有归还它们。

答案 3 :(得分:1)

问题在于:

if hasattr(f,'__iter__'):
    return sum(filter(fileSizes,f))

由于f是一个路径,因此它是一个字符串,并且它具有属性__iter__,因此您可以无限循环。