78

Python ではshutil.rmtree、読み取り専用ファイルを含むフォルダーに対して実行すると、次の例外が出力されます。

 File "C:\Python26\lib\shutil.py", line 216, in rmtree
   rmtree(fullname, ignore_errors, onerror)
 File "C:\Python26\lib\shutil.py", line 216, in rmtree
   rmtree(fullname, ignore_errors, onerror)
 File "C:\Python26\lib\shutil.py", line 216, in rmtree
   rmtree(fullname, ignore_errors, onerror)
 File "C:\Python26\lib\shutil.py", line 216, in rmtree
   rmtree(fullname, ignore_errors, onerror)
 File "C:\Python26\lib\shutil.py", line 216, in rmtree
   rmtree(fullname, ignore_errors, onerror)
 File "C:\Python26\lib\shutil.py", line 216, in rmtree
   rmtree(fullname, ignore_errors, onerror)
 File "C:\Python26\lib\shutil.py", line 216, in rmtree
   rmtree(fullname, ignore_errors, onerror)
 File "C:\Python26\lib\shutil.py", line 221, in rmtree
   onerror(os.remove, fullname, sys.exc_info())
 File "C:\Python26\lib\shutil.py", line 219, in rmtree
   os.remove(fullname)
WindowsError: [Error 5] Access is denied: 'build\\tcl\\tcl8.5\\msgs\\af.msg'

af.msg[ファイルのプロパティ] ダイアログを見ると、ファイルが読み取り専用に設定されていることに気付きました。

したがって、問題は次のとおりです。この問題を回避するための最も簡単な回避策/修正はrm -rf build/何ですか? (unxutils や cygwin などのサードパーティ ツールを使用する必要はありません。このコードは、PyWin32 がインストールされた Python 2.6 を使用してベア Windows インストールで実行することを目的としているため)

4

5 に答える 5

103

次の質問を確認してください: Windows で Python スクリプトを実行するのはどのユーザーですか?

どうやら答えは、ファイル/フォルダーを読み取り専用に変更してから削除することです。

コメントで@Sridhar Ratnakumarによって言及されたonerror()ハンドラーは次のとおりです。pathutils.py

def onerror(func, path, exc_info):
    """
    Error handler for ``shutil.rmtree``.

    If the error is due to an access error (read only file)
    it attempts to add write permission and then retries.

    If the error is for another reason it re-raises the error.
    
    Usage : ``shutil.rmtree(path, onerror=onerror)``
    """
    import stat
    # Is the error an access error?
    if not os.access(path, os.W_OK):
        os.chmod(path, stat.S_IWUSR)
        func(path)
    else:
        raise
于 2010-04-16T22:21:29.793 に答える
34

ファイルを削除する前に、各ファイルでos.chmodを使用してアクセスを保証するos.walkを使用して、独自の rmtree を実装することをお勧めします。

このようなもの(テストされていません):

import os
import stat

def rmtree(top):
    for root, dirs, files in os.walk(top, topdown=False):
        for name in files:
            filename = os.path.join(root, name)
            os.chmod(filename, stat.S_IWUSR)
            os.remove(filename)
        for name in dirs:
            os.rmdir(os.path.join(root, name))
    os.rmdir(top)      
于 2010-04-16T22:22:35.187 に答える
22

まあ、マークされた解決策は私にとってはうまくいきませんでした...代わりにこれをしました:

os.system('rmdir /S /Q "{}"'.format(directory))
于 2011-06-09T21:02:46.663 に答える
1
shutil.rmtree(path,ignore_errors=False,onerror=errorRemoveReadonly) 
def errorRemoveReadonly(func, path, exc):
    excvalue = exc[1]
    if func in (os.rmdir, os.remove) and excvalue.errno == errno.EACCES:
        # change the file to be readable,writable,executable: 0777
        os.chmod(path, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)  
        # retry
        func(path)
    else:
        raiseenter code here

ignore_errors が設定されている場合、エラーは無視されます。それ以外の場合、onerror が設定されている場合は、引数 (func、path、exc_info) を使用してエラーを処理するために呼び出されます。ここで、func は os.listdir、os.remove、または os.rmdir です。path は、失敗の原因となった関数への引数です。exc_info は sys.exc_info() によって返されるタプルです。ignore_errors が false で、onerror が None の場合、例外が発生します。ここにコードを入力してください

于 2015-02-12T11:53:53.493 に答える
-5

cygwinを使用してスクリプトを実行する場合は、次を使用できますsubprocess.call

from subprocess import call
call("rm -rf build/", shell=True)

もちろん、cygwin/bash エミュレーター内でのみ動作します。

于 2015-11-20T10:02:00.370 に答える