要是忘用 f.close() 或 with open() as f 关闭对象,会出什么问题吗?
发现 PIL 的 Image 不用关闭方法吗? f = Image.open(img_file) 就没找到 f.close() 的关闭方法,不知道是为什么,求指点
1
TimePPT 2018-01-05 22:34:28 +08:00 via iPhone
问之前建议去查文档
|
2
ech0x 2018-01-05 22:34:45 +08:00 1
好像是因为没有关闭文件的话,系统会先缓存起来,然后慢慢写入文件,这样的话如果在写入途中断电会造成写入文件的不完整。
|
3
billlee 2018-01-05 22:36:01 +08:00 2
不关闭文件就一直打开在那里了,相关数据结构会占用内存,在进程退出之前会造成文件删不掉,所在文件系统无法 unmount。同时一个进程能打开的文件描述符有数量上限,打开大量文件后就会打不开新文件。
PIL 的 Image class 明明有 close() 方法啊 https://pillow.readthedocs.io/en/5.0.0/reference/Image.html#PIL.Image.Image.close |
4
shihira 2018-01-05 22:39:35 +08:00 1
在 python 里不 close 跟在 C 里不 close 是一样,可能导致的问题包括不限于:
Windows 好像是自动加锁的,所以不能重复 open 咯 文件内容不能即时 flush 到磁盘直到进程结束 所以如果你线程比较多或者有可能变僵尸的话会造成一些很莫名其妙的错误。如果文件内容不大,能及时读到内存,读完就可以关了。Image 应该只管读,读完你还得手动关文件(关文件不是关图像)。 |
6
Arnie97 2018-01-06 02:10:39 +08:00 via Android
明明有 f.close()和 f.__exit__()啊。
https://github.com/python-pillow/Pillow/blob/0bb3f4f/src/PIL/Image.py#L557-583 |
8
shihira 2018-01-06 04:24:59 +08:00 1
@ysc3839 *nix 的特色之一不就是不主动加锁,要手动 fcntl/flock 吗。win 我不太了解,但是要是搬出 CreateFile 这种高大全 API 也就谈不上什么自动不自动了。刚刚求证了一下 MSDN,有讲到 Files opened by fopen_s and _wfopen_s are not sharable,我指的所谓自动是指调用一些比较通用、标准的函数时的行为。
|
9
binux 2018-01-06 04:27:17 +08:00 via Android
我怎么记得文件变量回收后会自动关闭
|
11
doubleflower 2018-01-06 07:58:06 +08:00 via Android
以前国外论坛看过一个解释,如果是原版的 py 引用计数垃圾回收,变量用完后就回收,文件自然也就关闭了,所以不 close 也没什么大问题。如果是别的版本的 py 垃圾回收话关闭时间会延长,就会有问题。所以建议还是加上
|
12
mimzy 2018-01-06 13:25:12 +08:00 via Android
If you don ’ t use “ with ”, when does Python close files? The answer is: It depends.
http://blog.lerner.co.il/dont-use-python-close-files-answer-depends/ |
14
rffan 2018-01-06 15:43:17 +08:00
找不到方法的时候就用 with 啊 这种类型自动 close。。。
|
15
ml071987 2018-01-06 16:05:57 +08:00
Image 里面有__exit__,退出时调用了 close
|