我的程序似乎是泄漏文件句柄.我怎样才能找到哪里?
我的程序在几个不同的地方使用文件句柄 - 从子进程输出,调用ctypes
API(ImageMagick)打开文件,然后复制它们.
它崩溃了shutil.copyfile
,但我很确定这不是泄漏的地方.
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Python25\Lib\site-packages\magpy\magpy.py", line 874, in main
magpy.run_all()
File "C:\Python25\Lib\site-packages\magpy\magpy.py", line 656, in run_all
[operation.operate() for operation in operations]
File "C:\Python25\Lib\site-packages\magpy\magpy.py", line 417, in operate
output_file = self.place_image(output_file)
File "C:\Python25\Lib\site-packages\magpy\magpy.py", line 336, in place_image
shutil.copyfile(str(input_file), str(self.full_filename))
File "C:\Python25\Lib\shutil.py", line 47, in copyfile
fdst = open(dst, 'wb')
IOError: [Errno 24] Too many open files: 'C:\\Documents and Settings\\stuart.axon\\Desktop\\calzone\\output\\wwtbam4\\Nokia_NCD\\nl\\icon_42x42_V000.png'
Press any key to continue . . .
Run Code Online (Sandbox Code Playgroud)
查看输出ls -l /proc/$pid/fd/
(当然,替换进程的 PID)以查看哪些文件已打开 [或者,在 win32 上,使用Process Explorer列出打开的文件];然后找出在代码中打开它们的位置,并确保close()
正在调用它们。(是的,垃圾收集器最终会关闭东西,但它并不总是足够快以避免耗尽 fd)。
检查任何可能阻止垃圾收集的循环引用也是一个很好的做法。(循环收集器最终会处理掉这些——但它可能运行得不够频繁,无法避免文件描述符耗尽;我个人就被这个问题困扰过)。