9

なぜos.remove(-string-)私のために働いていないのですか?私は次のようにコードを書いています:

try:
os.remove(a)
    output = current_time() + "\trmv successful"
    message = message + '\n' + output
    message = "".join(message)
    return message

except OSError:
    try:
        os.removedirs(a)
        output = current_time() + "\trmv successful"
        message = message + '\n' + output
        message = "".join(message)
        return message

    except OSError:
        output = current_time() + "\trmv failed: [?]"
        message = message + '\n' + output
        message = "".join(message)
        return message

そして、クライアントでコマンド21:32:53 rmv failed: [?]を実行するたびに返されます。rmv私のPythonバージョンは2.6.1です。

4

3 に答える 3

13

注目すべき例外があります!これをチェックして:

try:
    os.remove(a)
except OSError as e: # name the Exception `e`
    print "Failed with:", e.strerror # look what it says
    print "Error code:", e.code 

エラー メッセージを表示するようにコードを変更すると、失敗した理由がわかります。ドキュメントが役立ちます。

于 2013-02-15T13:47:20.073 に答える
5

エラーを印刷してみませんか?

try:
    os.remove(a)
    output = current_time() + "\trmv successful"
    message = message + '\n' + output
    message = "".join(message)
    return message

except OSError, e:
    print ("Failed to remove %s\nError is: %s" % (a,e))
    try:
        os.removedirs(a)
        output = current_time() + "\trmv successful"
        message = message + '\n' + output
        message = "".join(message)
        return message

    except OSError, e:
        print ("Failed twice to remove %s\nError is: %s" % (a,e))
        output = current_time() + "\trmv failed: [?]"
        message = message + '\n' + output
        message = "".join(message)
        return message

エラーは文字通りあなたが見るものなら何でもありえます...例えば許可の問題?

于 2013-02-15T13:50:12.977 に答える
0

ファイルを開いたり削除したりした後、time.sleep(0.2) を少し遅延させてみてください。または、Windows やウイルス対策の問題のようです。

Josh Rosenberg は、Python 開発に関するこのエラー追跡で同じことを指摘しています。

短いバージョン: インデックス作成とウイルス対策ツールが削除の発生を防ぎます。

より長いバージョン: DeleteFile (および最終的に DeleteFile に発展するすべてのもの) は、Windows ではおかしな方法で動作します。内部的には、ファイルへの HANDLE を開き、保留中の削除としてマークし、HANDLE を閉じます。その間、誰もファイルに忍び込んで別の HANDLE を取得しなかった場合、DeleteFile の非表示の HANDLE が閉じられると、ファイルは削除されます。適切に設計されたウイルス対策/インデックス作成ツールは oplock ( http://blogs.msdn.com/b/oldnewthing/archive/2013/04/15/10410965.aspx ) を使用するため、ファイルを開くことができますが、ファイルからシームレスに抜け出すことができます。通常のプロセスがファイルを排他的に制御したり削除したりする必要がある場合。残念ながら、「適切に設計された」という言葉は通常、ウイルス対策ツールに関連する用語ではないため、このようなエラーは比較的一般的です。

GetTempFileName() や MoveFile() を使用してファイルを邪魔にならない場所に移動するなどの回避策は機能しますが、それらは独自の競合状態を導入すると思います (一時ファイル自体は作成されますが、HANDLE はすぐに閉じられます。これは競合を意味する可能性があります)。 MoveFile()) をブロックする悪いアンチウイルスによって空のファイルを開きます)。

基本的に、Windows で実行していて、使いにくいアンチウイルス/インデックス作成ツールを使用している場合、同じ動作を維持するクリーンな回避策はありません。アクセス拒否エラーの危険を冒さずに、同じ名前のファイルを何度も作成および削除し続けることはできません。

とはいえ、ファイルを 1 回だけ開いて閉じるだけで、おそらく同じ結果が得られるでしょう。元の疑似コードからの変更:

于 2018-02-06T13:28:38.077 に答える