簡體   English   中英

Python:最大遞歸深度

[英]Python: maximum recursion depth

下面給出了一個函數,用於返回其參數大小的總和,可以是單個文件/目錄或文件/目錄列表。 代碼給出了一個錯誤消息RuntimeError: maximum recursion depth exceeded while calling a Python objectRuntimeError: 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

而不是編寫自己的adhoc目錄 - 橫向方法,而是使用內置的os.walk (Documentation)方法。

實際上,文檔中的示例(上面的鏈接)計算非目錄文件的總大小。

上次我檢查時,默認的最大遞歸深度為1000.您有幾個選項:

  1. 使用Stackless Python ,它不會施加任何遞歸限制(允許無限遞歸)。
  2. 以迭代樣式而不是遞歸方式重寫函數,因此首先不要溢出堆棧。
  3. 使用sys.setrecursionlimit設置最大遞歸限制。 請注意,如果濫用此功能,可能會導致分段錯誤。

有許多技巧可以避免深度遞歸問題,但我懷疑這不是你的核心問題。 (也許是因為你有非常深的目錄結構..所以首先在淺層目錄上進行測試)。

我猜你在鏈接引起的目錄樹中找到了一個循環結構。 即符號鏈接的目錄,指向父目錄。 (這種結構並不罕見)。

您可以通過在跟蹤目錄之前檢查目錄是否為符號鏈接來避免無限循環。

另一個可能性就是你得到了“。” 或“..”在您的列表中的某個地方。 這些也會產生無限循環。 我沒有看到這里發生的事情,但值得思考。 os.listdir似乎沒有返回它們。

問題在於:

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

由於f是一個路徑,它是一個字符串,它具有__iter__屬性,所以你無限循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM