Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
e9a086bf
Commit
e9a086bf
authored
Sep 24, 2014
by
Serhiy Storchaka
Browse files
Options
Browse Files
Download
Plain Diff
Issue #22427: TemporaryDirectory no longer attempts to clean up twice when
used in the with statement in generator.
parents
43705d76
5e193ac0
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
30 additions
and
12 deletions
+30
-12
Lib/tempfile.py
Lib/tempfile.py
+3
-12
Lib/test/test_tempfile.py
Lib/test/test_tempfile.py
+24
-0
Misc/NEWS
Misc/NEWS
+3
-0
No files found.
Lib/tempfile.py
View file @
e9a086bf
...
...
@@ -689,11 +689,6 @@ class TemporaryDirectory(object):
in it are removed.
"""
# Handle mkdtemp raising an exception
name
=
None
_finalizer
=
None
_closed
=
False
def
__init__
(
self
,
suffix
=
""
,
prefix
=
template
,
dir
=
None
):
self
.
name
=
mkdtemp
(
suffix
,
prefix
,
dir
)
self
.
_finalizer
=
_weakref
.
finalize
(
...
...
@@ -701,9 +696,8 @@ class TemporaryDirectory(object):
warn_message
=
"Implicitly cleaning up {!r}"
.
format
(
self
))
@
classmethod
def
_cleanup
(
cls
,
name
,
warn_message
=
None
):
def
_cleanup
(
cls
,
name
,
warn_message
):
_shutil
.
rmtree
(
name
)
if
warn_message
is
not
None
:
_warnings
.
warn
(
warn_message
,
ResourceWarning
)
...
...
@@ -717,8 +711,5 @@ class TemporaryDirectory(object):
self
.
cleanup
()
def
cleanup
(
self
):
if
self
.
_finalizer
is
not
None
:
self
.
_finalizer
.
detach
()
if
self
.
name
is
not
None
and
not
self
.
_closed
:
if
self
.
_finalizer
.
detach
():
_shutil
.
rmtree
(
self
.
name
)
self
.
_closed
=
True
Lib/test/test_tempfile.py
View file @
e9a086bf
...
...
@@ -1211,6 +1211,30 @@ class TestTemporaryDirectory(BaseTestCase):
self
.
assertNotIn
(
"Exception "
,
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
):
# ResourceWarning will be triggered by __del__
with
self
.
do_create
()
as
dir
:
...
...
Misc/NEWS
View file @
e9a086bf
...
...
@@ -137,6 +137,9 @@ Core and Builtins
Library
-------
-
Issue
#
22427
:
TemporaryDirectory
no
longer
attempts
to
clean
up
twice
when
used
in
the
with
statement
in
generator
.
-
Issue
#
22362
:
Forbidden
ambiguous
octal
escapes
out
of
range
0
-
0
o377
in
regular
expressions
.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment