2010-07-30 4 views
6

Possible en double:
check what files are open in PythonListe toutes les descripteurs de fichiers actuellement ouverts?

Bonjour,

Est-il possible d'obtenir une liste de tous les descripteurs de fichiers actuellement ouverts, je présume qu'ils sont stockés quelque part dans l'environnement . Je m'intéresse à la fonction theis, car je souhaite gérer en toute sécurité tous les fichiers ouverts lorsqu'une erreur fatale est déclenchée, c'est-à-dire fermer les handles de fichiers et remplacer les fichiers potentiellement corrompus par les fichiers d'origine.

J'ai la manipulation de travail mais sans savoir quelles poignées de fichiers sont ouvertes, je suis incapable de mettre en œuvre cette idée. En outre, lorsqu'un handle de fichier est initialisé, cela peut-il être hérité par une autre méthode importée?

Merci

+3

en double de http://stackoverflow.com/questions/2023608/check-what-files-are-open-in-python – robert

+0

qui o/s? Et il pourrait être utile d'ajouter cela comme balise. – Mawg

Répondre

3

La belle façon de le faire serait de modifier votre code pour garder une trace de quand il ouvre un fichier:

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

Ensuite, utilisez log_open au lieu de open pour ouvrir les fichiers. Vous pouvez même faire quelque chose de plus hacky, comme modifier la classe File pour se connecter. C'est couvert dans la question liée ci-dessus.

Il y a probablement un répugnant, sale bidouille impliquant le garbage collector ou à la recherche dans __dict__ ou quelque chose, mais vous ne voulez pas faire cela à moins que vous absolument vraiment vraiment au sérieux doit.

0

Si vous utilisez python 2.5+ vous pouvez utiliser le mot-clé with (bien que 2,5 `besoins de future with_statement import)

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

Je ne sais pas quel genre de défaillance catastrophique doit Bork la déclaration with, mais je suppose que c'est vraiment mauvais. Sur Windows XP, mon test non scientifique rapide:

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

puis tuer le processus avec le Gestionnaire des tâches de Windows a écrit encore les données dans un fichier.

Questions connexes