Fermer tous les fichiers ouverts sur ipython

parfois, en utilisant ipython, vous pouvez frapper une exception dans une fonction qui a ouvert un fichier en mode écriture. Cela signifie que la prochaine fois que vous exécutez la fonction que vous obtenez une valeur d'erreur,

ValueError: le fichier 'filename' est déjà ouvert. Veuillez le fermer avant de le rouvrir en mode écriture.

cependant depuis que la fonction a été désactivée, la poignée de fichier (qui a été créée à l'intérieur de la fonction) est perdue, donc elle ne peut pas être fermée. La seule façon autour de lui semble être pour fermer la ipython session, au point où vous obtenez le message:

fermeture des fichiers restants: nom du fichier... fait

Est-il un moyen de demander ipython pour fermer les fichiers sans quitter la session?

10
demandé sur jcollado 2012-01-24 20:27:38

2 réponses

vous devriez toujours essayer d'utiliser le with déclaration lorsque vous travaillez avec des fichiers. Par exemple, utilisez quelque chose comme

with open("x.txt") as fh:
    ...do something with the file handle fh

cela garantit que si quelque chose tourne mal pendant l'exécution du with bloc, et une exception est levée, le fichier est garanti d'être fermé. Voir le avec documentation pour plus d'informations sur cette.

Modifier: suite à une discussion dans les commentaires, il semble que L'OP ait besoin d'avoir un nombre de fichiers ouverts en même temps et doit utiliser les données de plusieurs fichiers à la fois. Clairement avoir beaucoup de imbriquée with états, un pour chaque fichier ouvert, n'est pas une option et va à l'encontre de l'idéal que "la télévision est mieux que imbriqués".

Une option serait d'envelopper le calcul dans un try/finally bloc. Par exemple,

file_handles = []
try:
    for file in file_list:
        file_handles.append(open(file))

    # Do some calculations with open files

finally:
    for fh in file_handles:
        fh.close()

le bloc final contient le code qui doit être exécuté après tout try,except ou else bloquent, même si un exception s'est produite. À partir de la documentation:

Si finally est présent, il indique un "nettoyage" de gestionnaire. try la clause est exécutée, y compris tout except et else les clauses. Si une exception se produit dans l'une quelconque des clauses et n'est pas traitée, l'exception est temporairement enregistré. finally la clause est exécutée. S'il y a une exception sauvegardée, elle est soulevée à la fin de finally l'article. Si le finally la clause soulève une autre exception ou exécute une instruction return ou break, l'exception sauvegardée est perdue. L'information d'exception n'est pas disponible au programme pendant l'exécution du finally l'article.

9
répondu Chris 2012-01-26 10:48:22

quelques idées:

  • toujours finally (ou with bloquer) lorsque vous travaillez avec des fichiers, de sorte qu'ils sont correctement fermées.
  • vous pouvez fermer aveuglément les descripteurs de fichier non standard en utilisant os.close(n)n est un nombre supérieur à 2 (c'est spécifique à unix, donc vous pourriez vouloir regarder /proc/ipython_pid/fd/ pour voir quels descripteurs le processus a ouvert jusqu'à présent).
  • vous pouvez inspecter les cadres de pile capturés locaux pour voir si vous pouvez trouver la référence à la rebelle fichier et fermez-le... jetez un oeil à sys.last_traceback
7
répondu fortran 2012-01-24 16:39:36