[Python] shutil.rmtree() 無法處理 symbolic link to folder
今天同事回報了一個問題,說 shutil.rmtree() 丟出了一個 exception,
說是 rmtree 不能用在 symbolic link 上面…
看了一下,程式的邏輯是先用 os.path.isdir() 看是不是目錄,
如果是目錄的話,就呼叫 shutil.rmtree() 去砍~
>>> os.path.isdir("zzz") True >>> import shutil >>> shutil.rmtree("zzz") Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 232, in rmtree onerror(os.path.islink, path, sys.exc_info()) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 230, in rmtree raise OSError("Cannot call rmtree on a symbolic link") OSError: Cannot call rmtree on a symbolic link
這邏輯看起來沒什麼問題,只是遇到 symbolic link 指向目錄的話,
os.path.isdir() 還是傳回 True,而 shutil.rmtree() 不能用在這樣的 symbolic link file 上面~
想來是 shutil.rmtree() 也不能確定呼叫的人到底是想砍 symbolic link 本身,
還是想砍連結到的目錄…
以那個 case 的使用方式來說,我們只是要確保指到的路徑會消失就行,
不管它是檔案還是目錄還是 symbolic link…
用醜一點的方式來解決吧,檢查路徑到底是哪種東西,再決定怎麼砍:
if os.path.islink(file_path): os.remove(file_path) elif os.path.isdir(file_path): import shutil shutil.rmtree(file_path) else: # It is a file os.remove(file_path)
其實如果 python 有提供一個萬能的砍檔案/目錄/symbolic link 的函式就好了… 😛
(本頁面已被瀏覽過 1,236 次)