如何仅使用相对路径在Python中创建符号链接

时间:2017-02-27 19:19:47

标签: python operating-system relative-path symlink

考虑一个简单的函数来创建目录,然后是目录的符号链接,所有这些都需要在当前工作目录下进行。如果目录和链接直接位于当前工作目录中,则此过程成功。但是当目录和链接进一步嵌套时,目录创建成功,而创建的符号链接被破坏并指向不正确的路径。

In [1]: def make_dir_and_symlink(dir_relative_to_cwd, sym_relative_to_cwd):
   ...:     os.mkdir(dir_relative_to_cwd)
   ...:     os.symlink(dir_relative_to_cwd, sym_relative_to_cwd)
   ...:     

In [2]: make_dir_and_symlink("test", "test-link")

In [3]: os.path.exists("test")
Out[3]: True

In [4]: os.path.exists("test-link")
Out[4]: True

In [5]: make_dir_and_symlink("test/other-test", "test/other-test-link")

In [6]: os.path.exists("test/other-test")
Out[6]: True

In [7]: os.path.exists("test/other-test-link")
Out[7]: False

在第二个示例中没有求助于任何绝对路径,如何在相对于当前工作目录的路径中的某处创建符号链接?

1 个答案:

答案 0 :(得分:0)

通过合并os.path.relpathos.path.basename,可以在有限的情况下实现这一目标:

def make_dir_and_symlink(dir_relative_to_cwd, sym_relative_to_cwd):
    os.mkdir(dir_relative_to_cwd)
    target_name = os.path.basename(
        os.path.relpath(dir_relative_to_cwd, sym_relative_to_cwd)
    )
    os.symlink(target_name, sym_relative_to_cwd)



In [1]: def make_dir_and_symlink(dir_relative_to_cwd, sym_relative_to_cwd):
   ...:     os.mkdir(dir_relative_to_cwd)
   ...:     os.symlink(os.path.basename(os.path.relpath(dir_relative_to_cwd, sym_relative_to_cwd)), sym_relative_to_cwd)
   ...:     

In [2]: make_dir_and_symlink("test", "test-link")

In [3]: os.path.exists("test")
Out[3]: True

In [4]: os.path.exists("test-link")
Out[4]: True

In [5]: make_dir_and_symlink("test/other-test", "test/other-test-link")

In [6]: os.path.exists("test/other-test")
Out[6]: True

In [7]: os.path.exists("test/other-test-link")
Out[7]: True

当符号链接位置相对于目标位置可以是任意的时,预计不会处理这种情况。 os.path.basename只返回路径名的直接基本组件,因此它在这种情况下工作,因为它进一步假设目标及其符号链接在树中从当前工作目录开始彼此相邻。

一个解决方案不需要解析绝对路径,但仍然允许链接名称在当前工作目录中相对于目标名称是任意的,这是非常有价值的。