Merge pull request #3683 from radarhere/exclusive

Only close original fp in __del__ and __exit__ if original fp is exclusive
This commit is contained in:
Hugo 2019-03-18 20:37:21 +02:00 committed by GitHub
commit b8ea8814f0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 19 additions and 10 deletions

View File

@ -532,6 +532,18 @@ class TestImage(PillowTestCase):
with Image.open(test_file) as im:
self.assert_warning(None, im.save, temp_file)
def test_load_on_nonexclusive_multiframe(self):
with open("Tests/images/frozenpond.mpo", "rb") as fp:
def act(fp):
im = Image.open(fp)
im.load()
act(fp)
with Image.open(fp) as im:
im.load()
self.assertFalse(fp.closed)
class MockEncoder(object):
pass

View File

@ -578,11 +578,11 @@ class Image(object):
return self
def __exit__(self, *args):
if hasattr(self, "_close__fp"):
self._close__fp()
if (hasattr(self, 'fp') and hasattr(self, '_exclusive_fp')
and self.fp and self._exclusive_fp):
self.fp.close()
if hasattr(self, 'fp') and getattr(self, '_exclusive_fp', False):
if hasattr(self, "_close__fp"):
self._close__fp()
if self.fp:
self.fp.close()
self.fp = None
def close(self):

View File

@ -186,7 +186,7 @@ def _save_all(im, fp, filename):
# will preserve non-alpha modes
total = 0
for ims in [im]+append_images:
total += 1 if not hasattr(ims, "n_frames") else ims.n_frames
total += getattr(ims, "n_frames", 1)
if total == 1:
_save(im, fp, filename)
return
@ -254,10 +254,7 @@ def _save_all(im, fp, filename):
try:
for ims in [im]+append_images:
# Get # of frames in this image
if not hasattr(ims, "n_frames"):
nfr = 1
else:
nfr = ims.n_frames
nfr = getattr(ims, "n_frames", 1)
for idx in range(nfr):
ims.seek(idx)