2010-07-30 11 views
6

Eventuali duplicati:
check what files are open in PythonElenca tutti gli handle di file attualmente aperti?

Ciao,

E 'possibile ottenere un elenco di tutti gli handle di file attualmente aperti, presumo che sono posizionati da nell'ambiente .

Sono interessato a questa funzione, poiché mi piacerebbe gestire in modo sicuro tutti i file aperti quando si verifica un errore irreversibile, ovvero chiudere gli handle di file e sostituire i file potenzialmente danneggiati con i file originali.

ho la gestione di lavoro, ma senza sapere cosa handle di file sono aperti, sono in grado di attuare questa idea.

Per inciso, quando un handle di file viene inizializzato, può questo essere ereditata da un altro metodo importato?

Grazie

+3

duplicati di http://stackoverflow.com/questions/2023608/check-what-files-are-open-in-python – robert

+0

che o/s? E potrebbe essere utile aggiungerlo anche come tag. – Mawg

risposta

3

Il bella modo per farlo sarebbe quello di modificare il codice per tenere traccia di quando si apre un file:

def log_open(*args, **kwargs): 
    print("Opening a file...") 
    print(*args, **kwargs) 
    return open(*args, **kwargs) 

Poi, utilizzare log_open invece di open per aprire i file. Si potrebbe anche fare qualcosa di più hacky, come la modifica della classe File per accedere sé. Questo è coperto nella domanda collegata sopra.

C'è probabilmente un disgustosa, sporca mod che coinvolge il garbage collector o in cerca di __dict__ o qualcosa del genere, ma non si vuole fare che se non si assolutamente veramente veramente sul serio must.

5

lsof,/proc/PID/fd/

0

Se stai usando python 2.5+ è possibile utilizzare la parola chiave with (anche se 2,5 bisogni `da futuro with_statement importazione)

with open('filename.txt', 'r') as f: 
    #do stuff here 
    pass 
#here f has been closed and disposed properly - even with raised exceptions 

non so che tipo di guasto catastrofico deve bork la dichiarazione with, ma presumo che sia davvero pessima. Su WinXP, il mio test rapido non scientifico:

import time 
with open('test.txt', 'w') as f: 
    f.write('testing\n') 
    while True: 
     time.sleep(1) 

e poi uccidere il processo con Task Manager di Windows ancora scritto i dati su file.