2009-02-22 13 views
5

私はPython 2.5でウィンドウズにいます。私は書くためのオープンファイルを持っています。私はいくつかのデータを書きます。コールファイルを閉じる。 Windowsエクスプローラを使用してフォルダからファイルを削除しようとすると、プロセスにファイルのハンドルがまだ保持されているというエラーが表示されます。なぜfile.close()を呼び出した後、Pythonがファイルハンドルを解放しないのですか?

私はPythonをシャットダウンしてもう一度やり直すと成功します。

+0

Pythonsが*何かを簡単にリリースすることは決してありませんでした。 :P:P – Cerebrus

+0

@Cerberus Tee hee! – Pitarou

+1

エラーを示す最小限の完全なプログラムを投稿してみてください。これは起こってはいけないので、おそらく修正するのは簡単なことでしょう。 – dwc

答えて

4

これを閉じます。 f.close()が呼び出されていますか? 同じシナリオをテストしただけで、ウィンドウが私のためにファイルを削除します。

2

ファイルオブジェクトの周りの例外を処理していますか?

f = open('hello.txt') 
try: 
    perform_an_operation_that_causes_f_to_raise_an_exception() 
    f.close() 
except IOError: 
    pass 

あなたが見ることができるように、f.close:あなたがこれを行うべき理由、次のコード行を考慮し検討して

f = open("hello.txt") 
try: 
    for line in f: 
     print line 
finally: 
    f.close() 

:その場合は、エラー処理は次のようになりますことを確認してください上記のコードでは決して呼び出されません。問題は、上記のコードがfにガベージコレクションを行わないということです。その理由は、sys.tracebackでfが引き続き参照されているからです。その場合、唯一の解決策は、finallyブロックでfのcloseを手動で呼び出すか、sys.tracebackをNoneに設定することです(前者を強くお勧めします)。チュートリアルで説明

3

with open('/tmp/workfile', 'r') as f: 
    read_data = f.read() 

それはあなたがそれが最終的にブロックを試みることは本当に必要はありません

すぎ、酸洗/ unpickle化書き込み時や作品:物事のJavaの道ではなく、Pythonの

+0

あなたが最も確実に 'finally'ブロックを持っているのは、それ以前のコードが例外をスローする可能性がある場合です。ファイル操作はその可能性があります。 – Davy8

+0

Davy:python 2.5以降では、ファイルオブジェクトには '_enter_'と' _exit_'メソッドが装備されています。 Pythonは式を評価し、 '_enter_'メソッドを呼び出してコード本体を実行します。そのコードで何が起きても、ガードオブジェクトの' _exit_'メソッドを呼び出します。例外を処理し、常にファイルを閉じます。代わりに試してみよう。これを有効にする必要があります: 'from __future__ import with_statement' –

0

同じことが私に起こったので、私はこれを探していました。質問は私を助けませんでしたが、私は何が起こったのか考え出したと思います。

私が書いたオリジナルのバージョンでは、例外の場合にファイルに 'finally'句を追加することを怠りました。

対話型プロンプトからスクリプトをテストしていて、ファイルが開いている間に例外が発生しました。私が気づいていなかったのは、ファイルオブジェクトがすぐにガベージコレクションされなかったということでした。その後、同じインタラクティブセッションからスクリプトを実行したときに、新しいファイルがクローズされても、最初のファイルオブジェクトはまだ開いていないため、ファイルハンドルはまだ使用されていましたオペレーティングシステムの観点。

私が対話型プロンプトを閉じると、ファイルが開いている間にその例外が発生したことを思い出し、何が起こっていたのかが分かりました。 (モラル:不十分な睡眠でプログラムしようとしないでください:))

当然のことながら、これは元のポスターの場合に起こったことではありません。特定の状況を覚えていないかもしれませんが、症状は似ているので、私はこれを確認するために、同じ状況で捕まって誰かが答えを探している人のために追加すると思いました。

関連する問題