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



Python 3.7 doc foros.symlink(src, dst)isCreate a symbolic link pointing to src named dst.

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

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

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

在笔记本的一个单元格中,我将输入:

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

但是,这不起作用,这将在 dir2 中创建一个 file2,但是当您查看此文件的属性时,它的TypeLink(broken) (inode/symlink)的,它的Link targetdir1/file1的。链接目标是您在 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是相对于dstsrc路径而不是src,并且dst是工作目录的路径?

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

软链接保存文件的原始位置,这意味着"dir2/file2"保存位置"dir1/file1"。当您将文件

"dir2/file2"分类时,这将在目录"dir2/"内搜索"dir1/file1",该目录是"file2"的工作目录,并且dir2中没有名为"dir1/file1"的路径
os.symlink('../dir1/file1', 'dir2/file2')

当你把这个文件DIR2/File2 ,"File2"的父目录是"DIR2"。 与上述相同。不同的是"."表示从您现在站立的位置转到一个目录。从该位置转到"dir1/file1",这样它就可以工作了。

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

最新更新