我正在运行一段代码,有时候几小时后,有时候几分钟后就会出现以下错误:
OSError: [Errno 24] Too many open files
我在调试时遇到了一些麻烦。下面代码片段中的标记行总是触发错误。
try:
with open(filename, 'rb') as f:
contents = f.read() <----- error triggered here
except OSError as e:
print("e = ", e)
raise
else:
# other stuff happens
然而,我看不出这段代码有什么问题(对吧?),所以我猜测代码的其他部分没有正确地关闭文件。尽管我经常打开文件,但我总是使用“with”语句打开它们,我的理解是即使发生错误,文件也会被关闭(对吧?)。因此,我的代码的另一部分如下所示
try:
with tarfile.open(filename + '.tar') as tar:
tar.extractall(path=target_folder)
except tarfile.ReadError as e:
print("e = ", e)
except OSError as e:
print("e = ", e)
else:
# If everything worked, we are done
return
上面的代码经常遇到ReadError,但即使发生这种情况,文件也应该被关闭,对吧?那么我不明白为什么会遇到太多打开的文件?抱歉,这对您来说无法重现,因为我无法足够调试它,我只是在寻找一些提示,因为我迷失了。任何帮助都将不胜感激......
编辑:我使用 MacBook。以下是ulimit -a的输出:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 256
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 1418
virtual memory (kbytes, -v) unlimited
根据 @sj95126 的建议,我更改了有关 tar 文件的代码,确保文件已关闭。
try:
tar = tarfile.open(filename + '.tar')
tar.extractall(path=target_folder)
except tarfile.ReadError as e:
print("tarfile.ReadError e = ", e)
except OSError as e:
print("e = ", e)
else:
# If everything worked, we are done
return
finally:
print("close tar file")
try:
tar.close()
except:
print("file already closed")
但这并没有解决问题。
with
应该导致文件被关闭;但是,管理对象中总是存在错误的可能性。tarfile
对象必须关闭文件,with
无法到达file
对象并执行此操作。仅供测试,请尝试在try
中添加finally
子句,并显式调用tar.close()
,看看是否有所帮助。 - sj95126