examples - os.system() python
Modificando un enlace simbólico en python (5)
¿Cómo cambio el enlace simbólico para que apunte de un archivo a otro en Python? La función os.symlink () solo parece funcionar para crear nuevos enlaces simbólicos.
Investigué esta pregunta recientemente, y descubrí que la mejor manera es unlink
y luego symlink
. Pero si solo necesita corregir los enlaces rotos, por ejemplo, con la sustitución automática, puede hacer os.readlink
:
for f in os.listdir(dir):
path = os.path.join(dir, f)
old_link = os.readlink(path)
new_link = old_link.replace(before, after)
os.unlink(path)
os.symlink(new_link, path)
No olvide agregar un comando raise en el caso cuando e.errno! = Errno.EEXIST No desea ocultar un error entonces:
if e.errno == errno.EEXIST:
os.remove(link_name)
os.symlink(target, link_name)
else:
raise
Podría os.unlink()
primero y luego volver a crear utilizando os.symlink()
para apuntar al nuevo destino.
Si necesita una modificación atómica, el desvinculación no funcionará.
Una mejor solución sería crear un nuevo enlace simbólico temporal y luego cambiarle el nombre por encima del existente:
os.symlink(target, tmpLink)
os.rename(tmpLink, linkName)
Puede verificar que se haya actualizado correctamente también:
if os.path.realpath(linkName) == target:
# Symlink was updated
Sin embargo, de acuerdo con la documentación para os.rename, puede que no haya forma de cambiar atómicamente un enlace simbólico en Windows. En ese caso, simplemente eliminarías y volverías a crear.
Una pequeña función que trata de un enlace simbólico y si falla debido a un archivo existente, lo elimina y enlaza nuevamente.
import os, errno
def symlink_force(target, link_name):
try:
os.symlink(target, link_name)
except OSError, e:
if e.errno == errno.EEXIST:
os.remove(link_name)
os.symlink(target, link_name)
else:
raise e