2012-03-30 21 views
19

En mi máquina Linux máquina ulimit -n da 1024. Este código:¿Cómo cierro los archivos de tempfile.mkstemp?

from tempfile import mkstemp 

for n in xrange(1024 + 1): 
    f, path = mkstemp()  

falla en el último bucle de línea con:

Traceback (most recent call last): 
    File "utest.py", line 4, in <module> 
    File "/usr/lib/python2.7/tempfile.py", line 300, in mkstemp 
    File "/usr/lib/python2.7/tempfile.py", line 235, in _mkstemp_inner 
OSError: [Errno 24] Too many open files: '/tmp/tmpc5W3CF' 
Error in sys.excepthook: 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/dist-packages/apport_python_hook.py", line 64, in apport_excepthook 
ImportError: No module named fileutils 

Parece que he abierto a muchos archivos - pero el type de f y path son simplemente int y str así que No estoy seguro de cómo cerrar cada archivo que abrí. ¿Cómo cierro los archivos de tempfile.mkstemp?

Respuesta

13
import tempfile 
import os 
for idx in xrange(1024 + 1): 
    outfd, outsock_path = tempfile.mkstemp() 
    outsock = os.fdopen(outfd,'w') 
    outsock.close() 
+8

Sólo para explicar un poco. mkstemp() devuelve un descriptor de archivo de Unix, por lo que para trabajar con él necesita abrirlo usando fdopen o usar la función de cierre de os: os.close() – turtlebender

+0

Gracias, @turtlebender. – unutbu

22

Desde mkstemp() devuelve un descriptor de archivo en bruto, puede utilizar os.close():

import os 
from tempfile import mkstemp 

for n in xrange(1024 + 1): 
    f, path = mkstemp() 
    # Do something with 'f'... 
    os.close(f) 
2

Uso os.close() para cerrar el descriptor de archivo:

import os 
from tempfile import mkstemp 

# Open a file 
fd, path = mkstemp() 

# Close opened file 
os.close(fd) 
Cuestiones relacionadas