2011-11-28 18 views
17

Pythonで1つのファイルから別のファイルへのシンボリックリンクを変更するにはどうすればよいですか? os.symlink()関数は新しいシンボリックリンクを作成するようにしか動作していないようです。Pythonのシンボリックリンクを変更する

答えて

9

最初にos.unlink()と入力し、os.symlink()を使用して新しいターゲットをポイントして再作成します。

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

シンボリックリンクしようとすると、それが原因で、既存のファイルの失敗した場合、それを削除する小さな機能再度リンクします。

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