2012-03-20 11 views
5

dire che ho un percorso di un file:Creazione di un link simbolico relativo in pitone senza utilizzare os.chdir()

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

in Python, mi piacerebbe creare un link simbolico nella stessa directory del file , che punta al file. Mi piacerebbe finire con questo:

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

posso farlo abbastanza facilmente usando os.chdir() per cd nella directory e creare i link simbolici. Ma os.chdir() non è thread-safe, quindi mi piacerebbe evitare usandolo. Supponendo che la directory di lavoro corrente del processo non sia la directory con il file (os.getcwd()! = '/ Path/to/some/directory'), qual è il modo migliore per farlo?

Credo che avrei potuto creare un collegamento rotto in qualunque directory mi trovo, quindi spostarlo nella directory con il file:

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

Esiste un modo migliore per fare questo?

Nota, non voglio finire con è questo:

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

Questo sembra terribilmente banale: 'os.symlink ('/ tar/get/di/link', '/ var/tmp/lnk')' creerà '/ var/tmp/lnk' indipendentemente da dove ti trovi ora e indipendentemente dal fatto che esista '/ tar/get/of', ecc. Se si desidera che la destinazione non inizi con'/', allora solo' os.symlink ('target', '/ var/tmp/lnk') ' . – torek

risposta

12

Si può solo impostare il secondo argomento per la destinazione, come:

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

Doh! Grazie per quello. Ha un senso totale e mi sento sciocco per non averlo provato. – Josh

+1

Assicurati, il file di collegamento non esiste, o meglio rimuovilo 'os.remove ("/percorso/a/alcuni/directory/collegamento simbolico ")' –

14

È inoltre possibile utilizzare os.path.relpath() in modo da poter utilizzare collegamenti simbolici con percorsi relativi. Supponiamo che lo script sia in una directory foo/ e che questa directory contenga le sottodirectory src/ e dst/ e che si desideri creare collegamenti simbolici relativi in ​​dst/ in modo che puntino ai file in src/. Per farlo, si può fare:

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)) 
    ) 

elenco dei contenuti dell'archivio dst/ mostra poi:

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

link simbolici relativi sono utili se si desidera creare un archivio di tutto l'albero foo di directory, come Non credo che tar aggiorni i link simbolici in modo che facciano riferimento al percorso relativo all'interno del tarball generato.

Problemi correlati