为什么os.symlink使用相对于目的地的路径?

时间:2019-02-22 10:27:02

标签: python

os.symlink(src, dst)的Python 3.7文档为Create a symbolic link pointing to src named dst.

让我们想象一下这个工作目录:

+-- nb.ipynb
+-- dir1
|   +-- file1
+-- dir2

假设我想在dir2中创建一个名为filed2的符号链接,该链接指向我的笔记本dir1/file1中的nb.ipynb

在笔记本的一个单元格中,我将放置:

import os
os.symlink('dir1/file1', 'dir2/file2')

但是,这将不起作用,这将在dir2中创建一个file2,但是当您查看该文件的属性时,其TypeLink(broken) (inode/symlink),其Link targetdir1/file1。 Link目标是您在os.symlink中作为src放置的内容。 为了实现正确的符号链接,需要做

os.symlink('../dir1/file1', 'dir2/file2')

这意味着os.symlink(src, dest)src应该包含源相对于目标的路径。

由于必须多次创建此类符号链接,因此创建了此函数:

def symlink_rel(src, dst):
    rel_path_src = os.path.relpath(src, os.path.dirname(dst))
    os.symlink(rel_path_src, dst)

致电

symlink_rel('dir1/file1', 'dir2/file2')

将创建正确的符号链接。在我看来,os.symlink的行为不像文档所说的那样。为什么os.symlink需要src作为src相对于dst的路径,而不是srcdst作为工作目录的路径?

1 个答案:

答案 0 :(得分:1)

os.symlink('dir1/file1', 'dir2/file2') 

软链接保存文件的原始位置,这意味着“ dir2 / file2”保存位置“ dir1 / file1”。当您将文件“ dir2 / file2”设为目录时,这将在目录“ dir2 /”中搜索“ dir1 / file1”,目录“ dir2 /”是“ file2”的工作目录,并且在dir2中没有名为“ dir1 / file1”的路径

os.symlink('../dir1/file1', 'dir2/file2')

当您将此文件dir2 / file2设为目录时,“ file2”的父目录为“ dir2”。 与上面相同。区别在于“ ..”意味着从您现在所在的位置进入一个目录。从该位置转到“ dir1 / file1”,这样它将起作用。

  

不要考虑您的工作主管,请考虑使用父级的软链接   目录并根据该位置读取位置