Issue #22427: TemporaryDirectory no longer attempts to clean up twice when

used in the with statement in generator.
This commit is contained in:
Serhiy Storchaka 2014-09-24 13:26:25 +03:00
parent b87630c273
commit 5e193ac0bd
3 changed files with 30 additions and 12 deletions

View File

@ -663,11 +663,6 @@ class TemporaryDirectory(object):
in it are removed. in it are removed.
""" """
# Handle mkdtemp raising an exception
name = None
_finalizer = None
_closed = False
def __init__(self, suffix="", prefix=template, dir=None): def __init__(self, suffix="", prefix=template, dir=None):
self.name = mkdtemp(suffix, prefix, dir) self.name = mkdtemp(suffix, prefix, dir)
self._finalizer = _weakref.finalize( self._finalizer = _weakref.finalize(
@ -675,9 +670,8 @@ class TemporaryDirectory(object):
warn_message="Implicitly cleaning up {!r}".format(self)) warn_message="Implicitly cleaning up {!r}".format(self))
@classmethod @classmethod
def _cleanup(cls, name, warn_message=None): def _cleanup(cls, name, warn_message):
_shutil.rmtree(name) _shutil.rmtree(name)
if warn_message is not None:
_warnings.warn(warn_message, ResourceWarning) _warnings.warn(warn_message, ResourceWarning)
@ -691,8 +685,5 @@ class TemporaryDirectory(object):
self.cleanup() self.cleanup()
def cleanup(self): def cleanup(self):
if self._finalizer is not None: if self._finalizer.detach():
self._finalizer.detach()
if self.name is not None and not self._closed:
_shutil.rmtree(self.name) _shutil.rmtree(self.name)
self._closed = True

View File

@ -1211,6 +1211,30 @@ class TestTemporaryDirectory(BaseTestCase):
self.assertNotIn("Exception ", err) self.assertNotIn("Exception ", err)
self.assertIn("ResourceWarning: Implicitly cleaning up", err) self.assertIn("ResourceWarning: Implicitly cleaning up", err)
def test_exit_on_shutdown(self):
# Issue #22427
with self.do_create() as dir:
code = """if True:
import sys
import tempfile
import warnings
def generator():
with tempfile.TemporaryDirectory(dir={dir!r}) as tmp:
yield tmp
g = generator()
sys.stdout.buffer.write(next(g).encode())
warnings.filterwarnings("always", category=ResourceWarning)
""".format(dir=dir)
rc, out, err = script_helper.assert_python_ok("-c", code)
tmp_name = out.decode().strip()
self.assertFalse(os.path.exists(tmp_name),
"TemporaryDirectory %s exists after cleanup" % tmp_name)
err = err.decode('utf-8', 'backslashreplace')
self.assertNotIn("Exception ", err)
self.assertIn("ResourceWarning: Implicitly cleaning up", err)
def test_warnings_on_cleanup(self): def test_warnings_on_cleanup(self):
# ResourceWarning will be triggered by __del__ # ResourceWarning will be triggered by __del__
with self.do_create() as dir: with self.do_create() as dir:

View File

@ -13,6 +13,9 @@ Core and Builtins
Library Library
------- -------
- Issue #22427: TemporaryDirectory no longer attempts to clean up twice when
used in the with statement in generator.
- Issue #20912: Now directories added to ZIP file have correct Unix and MS-DOS - Issue #20912: Now directories added to ZIP file have correct Unix and MS-DOS
directory attributes. directory attributes.