2009-02-22 17 views
5

Sono in Windows con Python 2.5. Ho un file aperto per scrivere. Scrivo alcuni dati. Chiama il file vicino. Quando provo a eliminare il file dalla cartella utilizzando Windows Explorer, si sbaglia, dicendo che un processo mantiene ancora un handle per il file.Perché Python non rilascia gli handle di file dopo aver chiamato file.close()?

Se spengo Python e riprovo, ci riesce.

+0

Non ho mai conosciuto Python per rilasciare * qualsiasi cosa * facilmente, lasciati da piccoli file. : P: P – Cerebrus

+0

@Cerberus Tee heee! – Pitarou

+1

Prova a pubblicare il più piccolo programma completo che puoi realizzare e che mostra l'errore. Questo non dovrebbe accadere quindi è probabilmente qualcosa di semplice da risolvere. – dwc

risposta

4

Li chiude. Sei sicuro che f.close() viene chiamato? Ho appena provato lo stesso scenario e Windows cancella il file per me.

2

Si gestiscono eccezioni intorno all'oggetto file? In tal caso, assicurarsi che la gestione degli errori simile a questa:

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

Nel considerare il motivo per cui si dovrebbe fare questo, prendere in considerazione le seguenti righe di codice:

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

Come si può vedere, f.close non sarà mai chiamato nel codice sopra. Il problema è che il codice sopra farà sì che f non ottenga la garbage collection. Il motivo è che f sarà ancora referenziato in sys.traceback, nel qual caso l'unica soluzione è chiamare manualmente close su f in un blocco finally o impostare sys.traceback su None (e consiglio vivamente il precedente).

3

spiegato nel tutorial:

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

Funziona quando si scrive o decapaggio/deserializzazione, troppo

Non è proprio necessario che cercano blocco finally: modo Java di fare le cose, non Python

+0

Desiderate sicuramente avere il blocco 'finally' se il codice precedente ha la possibilità di lanciare un'eccezione, che qualsiasi operazione sui file ha il potenziale di fare. – Davy8

+0

Davy: Da python 2.5 in poi l'oggetto file è stato equipaggiato con i metodi '_enter_' e' _exit_'. Python valuta l'espressione, chiama il metodo '_enter_', quindi esegue il corpo del codice e, indipendentemente da ciò che accade in quel codice, chiama il metodo' _exit_' dell'oggetto guard. Si occupa delle eccezioni e chiude sempre il file. Con sostituti, prova-finalmente. Devi abilitarlo: 'da __future__ import with_statement' –

0

Stavo cercando questo, perché mi è successa la stessa cosa. La domanda non mi ha aiutato, ma penso di aver capito cosa è successo.

Nella versione originale della sceneggiatura che ho scritto, ho trascurato di aggiungere una clausola "finally" al file in caso di un'eccezione.

Stavo testando lo script dal prompt interattivo e ho ottenuto un'eccezione mentre il file era aperto. Quello di cui non mi rendevo conto era che l'oggetto file non veniva immediatamente raccolto dalla spazzatura. Successivamente, quando ho eseguito lo script (sempre dalla stessa sessione interattiva), anche se gli nuovi oggetti file venivano chiusi, il primo non era ancora stato, e quindi l'handle del file era ancora in uso, dal prospettiva del sistema operativo.

Una volta chiuso il prompt interattivo, il problema è andato via, in cui mi sono ricordato che si verificava un'eccezione mentre il file era aperto e si rendeva conto di cosa stava succedendo. (Morale: non provare a programmare su sonno insufficiente.))

Naturalmente, non ho idea se questo è ciò che è accaduto nel caso del poster originale, e anche se il poster originale è ancora in circolazione, potrebbe non ricordare le circostanze specifiche, ma i sintomi sono simili, quindi ho pensato di aggiungere questo come qualcosa da controllare, per chiunque fosse coinvolto nella stessa situazione e in cerca di una risposta.

Problemi correlati