2012-03-30 7 views
19

Auf meiner Maschine Linux-Maschine ulimit -n gibt 1024. Dieser Code:Wie schließe ich die Dateien von tempfile.mkstemp?

from tempfile import mkstemp 

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

nicht in der letzten Zeile Schleife mit:

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 

Es scheint, wie ich zu viele Dateien geöffnet haben - aber die type von f und path sind einfach int und str so ich bin mir nicht sicher, wie ich jede geöffnete Datei schließe. Wie schließe ich die Dateien von tempfile.mkstemp?

Antwort

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

nur ein bisschen zu erklären. mkstemp() gibt einen Unix-Dateideskriptor zurück, damit Sie damit arbeiten können, müssen Sie ihn entweder mit fdopen öffnen oder die os close-Funktion verwenden: os.close() – turtlebender

+0

Danke, @turtlebender. – unutbu

22

Seit mkstemp() liefert einen rohen Deskriptordatei, können Sie os.close() verwenden:

import os 
from tempfile import mkstemp 

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

Verwenden os.close() den Dateideskriptor zu schließen:

import os 
from tempfile import mkstemp 

# Open a file 
fd, path = mkstemp() 

# Close opened file 
os.close(fd)