6

いくつかの計算を開始するスクリプトを開発する必要があります。一時ディレクトリを削除して、このスクリプトで ^C を正しく処理する必要があります。signal_handler でいくつかのバージョンのコードを試しました。

shutil.rmtree(self.temp)

あるいは

os.system("rm -rf " + self.temp)

実行を中断し、ディレクトリを削除するためにハンドラが呼び出されると、次のようなエラーが発生します。

OSError: [Errno 17] File exists : 'foo' 

また

rm: Unable to remove directory foo: File exists

実行後、削除したいディレクトリが空になりrm -r、シェルで a で削除できました。ただし、コードを実行すると:

for f  in os.listdir(self.temp):
    os.remove(os.path.join(self.temp,f))

for f in os.listdir(self.temp):
    print f

os.rmdir(self.temp)

もちろん、エラーが発生していますが、2 番目のループで次のファイルが検出されます。.nfsA13D3

誰でも私の問題の解決策を持っていますか? ありがとうございました !

4

2 に答える 2

9

これは、nfs でマウントされたファイルシステムでよく知られている問題であり、一部のユーティリティがファイルを閉じていません。オペレーティング システムは、ファイルを削除してもファイルを存続させることができますが、nfs が関係している場合、これは不可能です。OS の解決策は、その一時的な .nfs ファイルを作成し、ファイル記述子が使用されるまで保持することです。

この問題の本当の解決策はありません。最後の記述子が閉じられると .nfs ファイルは消えますが、(空の) ディレクトリは残ります。唯一可能な解決策は、まだ開いているファイル記述子を見つけて閉じることですが、それがプログラム内にあるかどうかによって異なります。私の場合、それは外部のコンパイル済みライブラリにあり、どこでリークしたかを見つける機会がありませんでした。

于 2012-06-28T07:22:10.273 に答える
0

コメントありがとうございます。Pythonコードでファイルを開いていましたが、signal_handlerはファイルオブジェクトが閉じているかどうかをチェックしませんでした。これが、スクリプト内のこれらのファイルを含むディレクトリを削除できなかった理由です。

于 2012-06-28T06:58:40.657 に答える