shutil.rmtree
Windowsでは読み取り専用ファイルは削除されません。「rm-rf」に相当するPythonはありますか?なんでこんなに痛いの?
6 に答える
shutil.rmtree
ファイルの削除で問題が発生したときに呼び出されるエラー処理関数を受け取ることができます。これを使用して、問題のあるファイルを強制的に削除できます。
http://mail.python.org/pipermail/tutor/2006-June/047551.htmlおよびhttp://techarttiki.blogspot.com/2008/08/read-only-windows-files-with-pythonに触発されました。 html:
import os
import stat
import shutil
def remove_readonly(func, path, excinfo):
os.chmod(path, stat.S_IWRITE)
func(path)
shutil.rmtree(top, onerror=remove_readonly)
(私はそのスニペットをテストしていませんが、始めるには十分なはずです)
PyWin32からwin32apiをインポートする場合は、次を使用できます。
win32api.SetFileAttributes(path, win32con.FILE_ATTRIBUTE_NORMAL)
ファイルを読み取り専用でなくするため。
別の方法は、Windowsでrmtreeを次のように定義することです。
rmtree = lambda path: subprocess.check_call(['cmd', '/c', 'rd', '/s', '/q', path])
これはおそらく、ドキュメントでこれについてのヒントを与えるという意味で、Python 3.5のリリース(現在-2015年6月-まだ開発中)で修正されるでしょう。
バグレポートはここにあります。そして、これはそれに応じたチェンジセットです。
Python3.5ドキュメントから新しく追加された例を参照してください。
import os, stat
import shutil
def remove_readonly(func, path, _):
"Clear the readonly bit and reattempt the removal"
os.chmod(path, stat.S_IWRITE)
func(path)
shutil.rmtree(directory, onerror=remove_readonly)
ActiveStateサイトに次のようなコメントがあります。
shutil.rmtreeには欠点があります。多くの場合、shutil.rmtree()を使用できますが、機能しない場合もあります。たとえば、Windowsで読み取り専用とマークされているファイルは、shutil.rmtree()で削除できません。
Win32apiおよびwin32conモジュールをPyWin32からインポートし、「win32api.SetFileAttributes(path、win32con.FILE_ATTRIBUTE_NORMAL」のような行をrmgeneric()関数に追加することで、この障害を克服できます。このアプローチを使用して、hot-backup.pyスクリプトを修正しました。 Subversion 1.4のバージョンなので、Windowsで動作します。レシピをありがとうございます。
私はWindowsを使用していないので、これが機能するかどうかを確認できません。
これはスティーブが投稿したものの変形であり、同じ基本的なメカニズムを使用しており、これはテストされています:-)