2011-01-31 17 views
21

Quiero copiar un archivo src al destino dst, pero si src pasa a ser un enlace simbólico, conserve el enlace en lugar de copiar el contenido del archivo. Después de realizar la copia, os.readlink debe devolver lo mismo para src y dst.Copiando un enlace simbólico en Python

El módulo shutil tiene varias funciones, tales como copyfile, copy y copy2, pero todos estos copiará los contenidos del archivo, y no conservará el enlace. shutil.move tiene el comportamiento correcto, aparte del hecho de que elimina el archivo original.

¿Existe una forma incorporada en Python para realizar una copia de archivo mientras se preservan los enlaces simbólicos?

Respuesta

38

Eso sí,

def copy(src, dst): 
    if os.path.islink(src): 
     linkto = os.readlink(src) 
     os.symlink(linkto, dst) 
    else: 
     shutil.copy(src,dst) 

shutil.copytree hace algo similar, pero como senderle señaló, es exigente con sólo copiar directorios, no archivos individuales.

+1

Intenté usar 'copytree' para hacer esto y obtuve un error de OSError que' src' no era un directorio; Creo que comprobar 'os.path.islink' realmente es la única forma. – senderle

+1

Pienso que es extraño que no haya una función dedicada para copiar archivos (en lugar de directorios como copytree) que preserve los enlaces simbólicos en lugar de resolverlos, pero tampoco pude encontrar ninguno. Parece que esta es la única forma ... –

Cuestiones relacionadas