os.symlink(src, dst)的Python 3.7文档是Create a symbolic link pointing to src named dst.
让我们想象一下这个工作目录:

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

假设我想在dir2中创建一个名为filed2的符号链接(symbolic link),该链接指向笔记本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放置的内容。
为了实现正确的符号链接(symbolic link),需要做的是
os.symlink('../dir1/file1', 'dir2/file2')

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

由于必须多次创建此类符号链接(symbolic link),因此创建了以下函数:
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')

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

最佳答案

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

软链接(soft link)保存文件的原始位置,这意味着“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”,这样它将起作用。

关于python - 为什么os.symlink使用相对于目的地的路径?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54825010/

10-15 08:50