This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author oconnor663
Recipients oconnor663
Date 2014-09-17.05:18:39
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <>
The following little script prints (but ignores) a FileNotFoundError.

import tempfile
def generator():
    with tempfile.TemporaryDirectory():
g = generator()

Exception ignored in: <generator object generator at 0x7fb319fe2c60>
Traceback (most recent call last):
  File "", line 6, in generator
  File "/usr/lib/python3.4/", line 691, in __exit__
  File "/usr/lib/python3.4/", line 697, in cleanup
  File "/usr/lib/python3.4/", line 454, in rmtree
  File "/usr/lib/python3.4/", line 452, in rmtree
FileNotFoundError: [Errno 2] No such file or directory: '/tmp/tmp7wek4xhy'

Putting print statements in the TemporaryDirectory class shows what's happening (confirming Guido's theory from!topic/python-tulip/QXgWH32P2uM): As the program exits, the TemporaryDirectory object is finalized. This actually rmtree's the directory. After that, the generator is finalized, which raises a GeneratorExit inside of it. That exception causes the with statement to call __exit__ on the already-finalized TemporaryDirectory, which tries to rmtree again and throws the FileNotFoundError.

The main downside of this bug is just garbage on stderr. I suppose in exceptionally unlikely circumstances, a new temp dir by the same name could be created between the two calls, and we might actually delete something we shouldn't. The simple fix would be to store a _was_cleaned flag or something on the object. Is there any black magic in finalizers or multithreading that demands something more complicated?
Date User Action Args
2014-09-17 05:18:39oconnor663setrecipients: + oconnor663
2014-09-17 05:18:39oconnor663setmessageid: <>
2014-09-17 05:18:39oconnor663linkissue22427 messages
2014-09-17 05:18:39oconnor663create