40

shutil.rmtreeWindowsでは読み取り専用ファイルは削除されません。「rm-rf」に相当するPythonはありますか?なんでこんなに痛いの?

4

6 に答える 6

61

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)

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

于 2009-12-11T17:41:23.187 に答える
4

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

win32api.SetFileAttributes(path, win32con.FILE_ATTRIBUTE_NORMAL)

ファイルを読み取り専用でなくするため。

于 2009-12-11T17:34:38.537 に答える
4

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

rmtree = lambda path: subprocess.check_call(['cmd', '/c', 'rd', '/s', '/q', path])
于 2014-09-12T15:49:52.000 に答える
4

これはおそらく、ドキュメントでこれについてのヒントを与えるという意味で、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)
于 2015-01-21T16:39:48.383 に答える
3

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を使用していないので、これが機能するかどうかを確認できません。

于 2009-12-11T17:34:30.187 に答える
2

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

PythonスクリプトはWindowsのようにどのユーザーを実行しますか?

于 2009-12-11T22:26:01.080 に答える