Atomic `ln -sf` In Python (symlink Overwriting Exsting File)
I want create a symlink, overwriting an existing file or symlink if needed. I've discovered that os.path.exists only returns True for non-broken symlinks, so I'm guessing that any
Solution 1:
This code tries to minimise the possibilities for race conditions:
import os
import tempfile
defsymlink_force(target, link_name):
'''
Create a symbolic link link_name pointing to target.
Overwrites link_name if it exists.
'''# os.replace() may fail if files are on different filesystems
link_dir = os.path.dirname(link_name)
whileTrue:
temp_link_name = tempfile.mktemp(dir=link_dir)
try:
os.symlink(target, temp_link_name)
breakexcept FileExistsError:
passtry:
os.replace(temp_link_name, link_name)
except OSError: # e.g. permission denied
os.remove(temp_link_name)
raise
Note:
If the function is interrupted (e.g. computer crashes), an additional random link to the target might exist.
An unlikely race condition still remains: the symlink created at the randomly-named
temp_link_name
could be modified by another process before replacinglink_name
.
I raised a python issue to highlight the issues of os.symlink()
requiring the target not exist.
Credit to Robert Seimer's input.
Post a Comment for "Atomic `ln -sf` In Python (symlink Overwriting Exsting File)"