Description
On Windows, it's common that a test fails at exit when trying to remove a temporary directory created by a test. Usually, it's because the test spawns a child process in this directory and the test tries to remove the temporary directory before the child process completes.
For example, temp_dir() of test.support.os_helper creates a temporary directory and then deletes it with rmtree(path) of test.support.os_helper: this function is different than shutil.rmtree(), it tries again on error with a timeout of 1.0 second.
But sometimes, the function fails with the error "PermissionError: [WinError 32] The process cannot access the file because it is being used by another process" on the os.rmdir() step.
If os.rmdir() fails with PermissionError, it would be nice to try again later.
Notes:
- I'm not sure why there is a fixed timeout of 1.0 second. I would prefer to use SHORT_TIMEOUT, or even LONG_TIMEOUT, of test.support.
- _force_run() should use test.support.sleeping_retry()
Traceback (most recent call last):
File "D:\a\cpython\cpython\Lib\test\support\os_helper.py", line 483, in temp_dir
yield path
File "D:\a\cpython\cpython\Lib\test\support\os_helper.py", line 536, in temp_cwd
yield cwd_dir
File "D:\a\cpython\cpython\Lib\test\libregrtest\main.py", line 701, in main
self._main(tests, kwargs)
File "D:\a\cpython\cpython\Lib\test\libregrtest\main.py", line 722, in _main
run_tests_worker(self.ns, self.worker_test_name)
File "D:\a\cpython\cpython\Lib\test\libregrtest\runtest_mp.py", line 101, in run_tests_worker
sys.exit(0)
SystemExit: 0
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "D:\a\cpython\cpython\Lib\test\support\__init__.py", line 203, in _force_run
return func(*args)
^^^^^^^^^^^
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'D:\\a\\cpython\\cpython\\build\\test_python_4372�\\test_python_worker_1096�'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "D:\a\cpython\cpython\Lib\runpy.py", line 198, in _run_module_as_main
return _run_code(code, main_globals, None,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\a\cpython\cpython\Lib\runpy.py", line 88, in _run_code
exec(code, run_globals)
File "D:\a\cpython\cpython\Lib\test\regrtest.py", line 47, in <module>
_main()
File "D:\a\cpython\cpython\Lib\test\regrtest.py", line 43, in _main
main()
File "D:\a\cpython\cpython\Lib\test\libregrtest\main.py", line 763, in main
Regrtest().main(tests=tests, **kwargs)
File "D:\a\cpython\cpython\Lib\test\libregrtest\main.py", line 695, in main
with os_helper.temp_cwd(test_cwd, quiet=True):
File "D:\a\cpython\cpython\Lib\contextlib.py", line 155, in __exit__
self.gen.throw(value)
File "D:\a\cpython\cpython\Lib\test\support\os_helper.py", line 534, in temp_cwd
with temp_dir(path=name, quiet=quiet) as temp_path:
File "D:\a\cpython\cpython\Lib\contextlib.py", line 155, in __exit__
self.gen.throw(value)
File "D:\a\cpython\cpython\Lib\test\support\os_helper.py", line 488, in temp_dir
rmtree(path)
File "D:\a\cpython\cpython\Lib\test\support\os_helper.py", line 445, in rmtree
_rmtree(path)
File "D:\a\cpython\cpython\Lib\test\support\os_helper.py", line 389, in _rmtree
_waitfor(lambda p: _force_run(p, os.rmdir, p), path)
File "D:\a\cpython\cpython\Lib\test\support\os_helper.py", line 333, in _waitfor
func(pathname)
File "D:\a\cpython\cpython\Lib\test\support\os_helper.py", line 389, in <lambda>
_waitfor(lambda p: _force_run(p, os.rmdir, p), path)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\a\cpython\cpython\Lib\test\support\__init__.py", line 214, in _force_run
return func(*args)
^^^^^^^^^^^
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'D:\\a\\cpython\\cpython\\build\\test_python_4372�