2012-03-20 104 views
5

decir que tengo una ruta a un archivo:Crear un enlace simbólico relativo en Python sin usar os.chdir()

/path/to/some/directory/file.ext 

en Python, me gustaría crear un enlace simbólico en el mismo directorio que el archivo , que apunta al archivo. Me gustaría terminar con esto:

/path/to/some/directory/symlink -> file.ext 

que pueda hacer esto con bastante facilidad utilizando os.chdir() para entrar al directorio y crear los enlaces simbólicos. Pero os.chdir() no es seguro para subprocesos, por lo que me gustaría evitar que lo use. Suponiendo que el directorio de trabajo actual del proceso no es el directorio con el archivo (os.getcwd()! = '/ Path/to/some/directory'), ¿cuál es la mejor manera de hacerlo?

supongo que podría crear un enlace roto en cualquier directorio en que estoy, a continuación, moverlo al directorio con el archivo:

import os, shutil 
os.symlink('file.ext', 'symlink') 
shutil.move('symlink', '/path/to/some/directory/.') 

¿Hay una mejor manera de hacer esto?

Nota, no quiero terminar con esto es:

/path/to/some/directory/symlink -> /path/to/some/directory/file.ext 
+0

Esto parece terriblemente trivial: 'os.symlink ('/ tar/get/of/link', '/ var/tmp/lnk')' creará '/ var/tmp/lnk' independientemente de dónde se encuentre ahora , y sin importar si '/ tar/get/of' existe, etc. Si desea que el destino no comience con'/', simplemente' os.symlink ('target', '/ var/tmp/lnk') ' . – torek

Respuesta

12

Se podía establecer el segundo argumento al destino, como:

import os 
os.symlink('file.ext', '/path/to/some/directory/symlink') 
+1

Doh! Gracias por eso. Tiene sentido total y me siento tonto por no haberlo intentado. – Josh

+1

Solo asegúrese de que el archivo de enlace no exista, o mejor, elimínelo 'os.remove ("/path/to/some/directory/symlink ")' –

14

También puede use os.path.relpath() para que pueda usar enlaces simbólicos con rutas relativas. Supongamos que su secuencia de comandos está en un directorio foo/ y este directorio tiene subdirectorios src/ y dst/, y desea crear enlaces simbólicos relativos en dst/ para que apunten a los archivos en src/. Para ello, se puede hacer:

import os 
from glob import glob 
for src_path in glob('src/*'): 
    os.symlink(
     os.path.relpath(
      src_path, 
      'dst/' 
     ), 
     os.path.join('dst', os.path.basename(src_path)) 
    ) 

Añadir el contenido de dst/ muestra a continuación:

1.txt -> ../src/1.txt 
2.txt -> ../src/2.txt 

enlaces simbólicos relativas son útiles para si desea crear un fichero de todo el árbol foo directorio, ya No creo que tar actualice los enlaces simbólicos para señalar la ruta relativa dentro del tarball generado.

Cuestiones relacionadas