2011-11-28 18 views

Respuesta

6

Investigué esta pregunta recientemente, y descubrí que la mejor manera es de hecho a unlink y luego a symlink. Pero si usted necesita sólo para arreglar los enlaces rotos, por ejemplo, con auto-sustitución, entonces usted 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) 
15

Una pequeña función que intenta enlazar simbólicamente y si falla debido a un archivo existente, se lo elimina y enlaces de nuevo.

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 
12

Si necesita una modificación atómica, la desvinculación no funcionará.

Una mejor solución sería la creación de un nuevo enlace simbólico temporal y, a continuación, cambiar su nombre sobre la existente:

os.symlink(target, tmpLink) 
os.rename(tmpLink, linkName) 

Puede comprobar para asegurarse de que se ha actualizado correctamente también:

if os.path.realpath(linkName) == target: 
    # Symlink was updated 

De acuerdo con la documentación para os.rename embargo, no puede haber manera de cambiar atómicamente un enlace simbólico en Windows. En ese caso, simplemente eliminar y volver a crear.

+4

Python 3.3 tiene 'os.replace' que se puede usar en lugar de 'os.rename' para proporcionar el mismo comportamiento en los sistemas de Posix y Windows. – Tom

0

No se olvide de añadir un comando de aumento en el caso cuando e.errno = errno.EEXIST usted no desea ocultar un error a continuación:

if e.errno == errno.EEXIST: 
    os.remove(link_name) 
    os.symlink(target, link_name) 
else: 
    raise 
Cuestiones relacionadas