2011-11-28 117 views

回答

6

我最近研究了這個問題,發現最好的方法確實是unlink,然後symlink。但是,如果你只需要修復損壞的鏈接,例如帶自動替換,那麼你可以做os.readlink

for f in os.listdir(dir): 
    path = os.path.join(dir, f) 
    old_link = os.readlink(path) 
    new_link = old_link.replace(before, after) 
    os.unlink(path) 
    os.symlink(new_link, path) 
15

它試圖符號鏈接,如果它失敗,因爲現有文件的一個小功能,它會刪除它並再次鏈接。

import os, errno 

def symlink_force(target, link_name): 
    try: 
     os.symlink(target, link_name) 
    except OSError, e: 
     if e.errno == errno.EEXIST: 
      os.remove(link_name) 
      os.symlink(target, link_name) 
     else: 
      raise e 
12

如果您需要原子修改,取消鏈接將不起作用。

更好的解決方案是創建一個新的臨時符號鏈接,然後在將其重命名現有的一個:

os.symlink(target, tmpLink) 
os.rename(tmpLink, linkName) 

您可以檢查,以確保它是正確更新過:

if os.path.realpath(linkName) == target: 
    # Symlink was updated 

儘管如此,根據os.rename的文檔,可能無法自動更改Windows中的符號鏈接。在這種情況下,您只需刪除並重新創建。

+4

的Python 3.3擁有'os.replace'它可以用來代替'os.rename'來在Posix和Windows系統上提供相同的行爲。 – Tom

0

不要忘記的情況下添加加薪命令時e.errno = errno.EEXIST你不想隱藏,然後一個錯誤:

if e.errno == errno.EEXIST: 
    os.remove(link_name) 
    os.symlink(target, link_name) 
else: 
    raise