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

Sta*_*ean 6 python

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

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

+-- nb.ipynb
+-- dir1
|   +-- file1
+-- dir2
Run Code Online (Sandbox Code Playgroud)

假设我想在我的 notebook 中创建一个dir2名为filed2指向的符号链接。dir1/file1nb.ipynb

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

import os
os.symlink('dir1/file1', 'dir2/file2')
Run Code Online (Sandbox Code Playgroud)

但是,这行不通,这将在 dir2 中创建一个 file2,但是当您查看此文件的属性时,它的TypeisLink(broken) (inode/symlink)Link targetis dir1/file1。链接目标是您在 os.symlink 中作为 src 放置的内容。要获得正确的符号链接,需要执行以下操作

os.symlink('../dir1/file1', 'dir2/file2')
Run Code Online (Sandbox Code Playgroud)

这意味着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)
Run Code Online (Sandbox Code Playgroud)

打电话

symlink_rel('dir1/file1', 'dir2/file2')
Run Code Online (Sandbox Code Playgroud)

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

Fuj*_*lan 6

os.symlink('dir1/file1', 'dir2/file2') 
Run Code Online (Sandbox Code Playgroud)

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

os.symlink('../dir1/file1', 'dir2/file2')
Run Code Online (Sandbox Code Playgroud)

当你 cat 这个文件 dir2/file2 时,“file2”的父目录是“dir2”。与上面相同。不同之处在于“..”表示从您现在所在的位置转到一个目录。从那个位置转到“dir1/file1”,这样它就可以工作了。

不要考虑你的工作主管,考虑软链接父目录并根据它读取位置