web-dev-qa-db-ja.com

Python

shutil.rmtreeは、Windows上の読み取り専用ファイルを削除しません。 python "rm -rf"に相当するものはありますか?なぜこれがそんなに苦痛なのですか?

31
kevin cline

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)

(私はそのスニペットをテストしていませんが、始めるには十分なはずです)

44
Steve Losh

PyWin32からwin32apiをインポートする場合は、次を使用できます。

win32api.SetFileAttributes(path, win32con.FILE_ATTRIBUTE_NORMAL)

ファイルを読み取り専用で停止させるため。

3
Paul

別の方法は、Windowsでrmtreeを次のように定義することです。

rmtree = lambda path: subprocess.check_call(['cmd', '/c', 'rd', '/s', '/q', path])
3
asmeurer

ActiveState サイトに次のようなコメントがあります。

shutdown.rmtreeには欠点があります。多くの場合、shutil.rmtree()を使用できるのは事実ですが、機能しない場合もあります。たとえば、Windowsで読み取り専用とマークされているファイルは、shutil.rmtree()で削除できません。

PyWin32からwin32apiおよびwin32conモジュールをインポートし、「win32api.SetFileAttributes(path、win32con.FILE_ATTRIBUTE_NORMAL」のような行をrmgeneric()関数に追加することで、この障害を克服できます。このアプローチを使用して、hot-backup.pyスクリプトを修正しました。 Subversion 1.4のバージョンなので、Windowsでも動作します。レシピをありがとうございます。

私はWindowsを使用していないので、これが機能するかどうかを確認できません。

2
ire_and_curses

これはおそらく、Python 3.5(現在-2015年6月-まだ開発中)のリリースで修正されると思われます。ドキュメンテーション。

バグレポートを見つけることができます ここ 。そして this はそれに応じたチェンジセットです。

Python 3.5 docs から新しく追加された例を参照してください:

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)
2
mozzbozz

これはスティーブが投稿したものの変形であり、同じ基本的なメカニズムを使用しており、これテストされています:-)

どのユーザーが行うかpythonスクリプトはWindowsのように実行されますか?

2
ThomasH