programa otro linea ejecutar desde cómo como comandos archivo python file garbage-collection del

otro - ejecutar python desde linea de comandos



¿Cómo cierra python los archivos que se han gc''ed? (4)

En CPython, al menos, los archivos se cierran cuando el objeto del archivo se desasigna. Consulte la función file_dealloc en Objects/fileobject.c en el origen de CPython. Los métodos Dealloc son tipo __del__ para los tipos C, excepto sin algunos de los problemas inherentes a __del__ .

Siempre había supuesto que un archivo se filtraría si se abría sin estar cerrado, pero solo verifiqué que si ingreso las siguientes líneas de código, el archivo se cerrará:

>>> f = open(''somefile.txt'') >>> del f

Solo por pura curiosidad, ¿cómo funciona esto? Noto que el archivo no incluye un método __ del __ .


La mejor suposición es que debido a que el tipo de archivo es un tipo incorporado, el intérprete se encarga de cerrar el archivo en la recolección de elementos no utilizados.

De forma alternativa, solo está comprobando después de que el intérprete de Python haya salido y todos los identificadores de archivo "filtrados" estén cerrados de todos modos.


Python utiliza el recuento de referencias y la destrucción determinística además de la recolección de basura. Cuando ya no hay más referencias a un objeto, el objeto se libera inmediatamente. Liberar un archivo lo cierra.

Esto es diferente de, por ejemplo, Java, donde solo hay recolección de basura no determinista. Esto significa que no sabe cuándo se libera el objeto, por lo que tendrá que cerrarlo manualmente.

Tenga en cuenta que el recuento de referencias no es perfecto. Puede tener objetos con referencias circulares, que no son accesibles desde el programa. Es por eso que Python tiene recolección de basura además del recuento de referencias.


De ahí la declaración con .

Para Python 2.5, use

from __future__ import with_statement

(Para Python 2.6 o 3.x, no hacer nada)

with open( "someFile", "rU" ) as aFile: # process the file pass # At this point, the file was closed by the with statement. # Bonus, it''s also out of scope of the with statement, # and eligible for GC.