2017-02-27 63 views
0

考虑一个简单的函数来创建一个目录,然后指向该目录的符号链接,所有这些都需要在当前工作目录下假定。在目录和链接直接在当前工作目录内的情况下,该过程成功。但是,当目录和链接进一步嵌套时,目录创建成功,而创建的符号链接已断开并指向不正确的路径。如何仅使用相对路径在Python中创建符号链接

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 

没有在第二个例子诉诸任何绝对路径,我怎么能创造的地方是相对于当前工作目录的路径中的符号链接?

回答

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将仅返回路径名的直接基本组件,因此它在这种情况下工作,因为它进一步假定目标和它的符号链接从当前工作目录开始在树中彼此相邻。

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

相关问题