3

このようなプロジェクト設定があります

project/src/test/python/main.py
project/test-output

main-testscript を削除してから、test-output フォルダーを再作成します。

だから私はこのコードをそこに置きました。

if os.path.exists("test-output"):
    shutil.rmtree("test-output")
os.mkdir("test-output")

しかし、私がそれを実行すると

d:\projects\thisproject>python src\test\python\main.py

Windows からアクセス拒否エラーが発生します。【エラー5】

これを修正する方法は?

mkdir コマンドは問題なく動作します。

4

4 に答える 4

2

私は最近、Windows 7でのshutil.rmtree()のこの動作を、単体テストからテストフォルダーを作成および破棄するときにも見ました。そして、いいえ、ディレクトリまたはその中の何かへのアクティブな参照を持っているものは何もありませんでした。エクスプローラーウィンドウさえありませんでした。私の「解決策」(あなたがそれをそれと呼ぶことができるなら)はすることでした:

shutil.rmtree("my/test/dir", ignore_errors=True)

必ずしも美しいものではありませんが、それは私にとって問題を解決しました。

ちなみに、これは64ビットのWindows 7マシンで、SSD上にありました。同僚が、別のマシンのWindows共有上のディレクトリを削除するときにshutil.rmtree()で同じ問題を報告しました。ほんの少しでも、Windowsがここに物事をキャッシュしているような気がします。

于 2012-06-02T10:33:50.360 に答える
1

リンクを解除するとアイテムがビューからすぐに削除される Unix とは異なり、Windows はファイル/ディレクトリを「閉じるときに削除」としてマークするだけです。MSDNのディレクトリ削除機能のドキュメントを参照してください。そのため、プロセス (エクスプローラー ウィンドウ、フルテキスト インデクサー、ウイルス スキャナーなど) がまだファイルへのハンドルを開いている場合、失敗します。

そのため、削除時のエラーを無視しても、os.mkdirステップで失敗します。簡単な修正方法の 1 つは、ディレクトリを再作成せずに、その内容をすべて削除することです。もう 1 つは、待機して数秒後に操作を再試行することです。

tempfile.makedtemp()この制限を回避する最善の方法は、実行ごとに( 経由で) 別の出力フォルダーを使用することです。最後の参照がなくなると削除が開始されますが、再作成は決して失敗しません。

于 2012-06-02T10:48:26.740 に答える
0

ほとんどの場合、フォルダを使用している可能性があります。そのフォルダ内にあるファイルを開くか、そのフォルダまたはそのサブフォルダを現在の作業ディレクトリとして使用します。

于 2012-06-02T10:06:52.827 に答える
0

これを試して:

def renewDir(name):
    while 1:
        try:
            if os.path.exists(name):
                shutil.rmtree(name)
            os.makedirs(name)   
            break
        except:
            pass
于 2013-06-06T15:13:02.347 に答える