Mercurial > cpython-lru_cache-weakref
diff Lib/importlib/_bootstrap.py @ 74998:de6703671386
Have importlib use os.replace() for atomic renaming.
Closes issue #13961. Thanks to Charles-François Natali for the patch.
| author | Brett Cannon <brett@python.org> |
|---|---|
| date | Fri, 17 Feb 2012 09:26:53 -0500 |
| parents | b8593ec7e8c5 |
| children | e477832212b9 |
line wrap: on
line diff
--- a/Lib/importlib/_bootstrap.py Fri Feb 17 23:17:34 2012 +1000 +++ b/Lib/importlib/_bootstrap.py Fri Feb 17 09:26:53 2012 -0500 @@ -137,26 +137,16 @@ def _write_atomic(path, data): - """Best-effort function to write data to a path atomically. - Be prepared to handle a FileExistsError if concurrent writing of the - temporary file is attempted.""" - # Renaming should be atomic on most platforms (including Windows). - # Under Windows, the limitation is that we can't rename() to an existing - # path, while POSIX will overwrite it. But here we don't really care - # if there is a glimpse of time during which the final pyc file doesn't - # exist. + """Function to write data to a path atomically.""" # id() is used to generate a pseudo-random filename. path_tmp = '{}.{}'.format(path, id(path)) fd = _os.open(path_tmp, _os.O_EXCL | _os.O_CREAT | _os.O_WRONLY, 0o666) try: + # We first write data to a temporary file, and then use os.replace() to + # perform an atomic rename. with _io.FileIO(fd, 'wb') as file: file.write(data) - try: - _os.rename(path_tmp, path) - except FileExistsError: - # Windows (if we had access to MoveFileEx, we could overwrite) - _os.unlink(path) - _os.rename(path_tmp, path) + _os.replace(path_tmp, path) except OSError: try: _os.unlink(path_tmp) @@ -602,9 +592,8 @@ return try: _write_atomic(path, data) - except (PermissionError, FileExistsError): - # Don't worry if you can't write bytecode or someone is writing - # it at the same time. + except PermissionError: + # Don't worry if you can't write bytecode. pass
