2012-03-30 14 views
19

Na mojej maszynie maszyna Linux ulimit -n podaje 1024. Ten kod:Jak zamknąć pliki z tempfile.mkstemp?

from tempfile import mkstemp 

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

nie w ostatniej pętli linii z:

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 

Wydaje się jakbym otworzyła wielu plików - ale type od f i path są po prostu int i str więc nie jestem pewien, jak zamknąć każdy otwarty plik. Jak zamknąć pliki z tempfile.mkstemp?

Odpowiedz

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

Wystarczy, aby wyjaśnić co nieco. mkstemp() zwraca deskryptor pliku unix, abyś mógł z nim pracować, musisz go otworzyć za pomocą fdopen lub użyć funkcji zamykającej os: os.close() – turtlebender

+0

Dzięki, @turtlebender. – unutbu

22

Od mkstemp() wraca surowy deskryptor pliku, można użyć 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

Zastosowanie os.close() aby zamknąć deskryptor:

import os 
from tempfile import mkstemp 

# Open a file 
fd, path = mkstemp() 

# Close opened file 
os.close(fd) 
Powiązane problemy