2017-02-27 111 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將僅返回路徑名的直接基本組件,因此它在這種情況下工作,因爲它進一步假定目標和它的符號鏈接從當前工作目錄開始在樹中彼此相鄰。

一個解決方案不需要解析絕對路徑,但仍然可以讓鏈接名稱在當前工作目錄中相對於目標名稱是任意的,這非常有價值。

相關問題