Issue #22427: TemporaryDirectory no longer attempts to clean up twice when
used in the with statement in generator.
This commit is contained in:
parent
b87630c273
commit
5e193ac0bd
|
@ -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
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue