Pythonのosモジュールを使ってシンボリックリンクを作成する

概要

pythonのosモジュールの関数を使ってシンボリックリンクを作成する方法です。

os.symlink(src, dst)
# src を指しているシンボリックリンクを dst に作成します。利用できる環境: Unix。

シンボリックリンクを作成するときに、よくどっちがsrcでどっちがdstか分からなくなるので、その辺を整理するためにまとめてみます。

コード(symlink.py)

# -*- coding: utf-8 -*-
import os
import sys

src = sys.argv[1]
dst = sys.argv[2]

# シンボリックリンク作成
#(src を指しているシンボリックリンクを dst に作成します)
os.symlink(src, dst)

使ってみる

  • ディレクトリ構成
 + test
    + symlink.py
    + module1
     + resource
    + module2
     + (ここからtest/module1/resourceにリンクをはる)
  • 実行例

 python symlink.py test/module1/resource test/module2/symlinkfile

これは、lnコマンドを以下のように実行したのと同じ意味です。

 ln -s test/module1/resource test/module2/symlinkfile

なお、lnコマンドでは、以下のようにシンボリックファイル名を省略した場合、自動的にリンク先のファイル名でシンボリックリンクが作成されます。(この例では、test/module2/resourceが作成される)

ln -s test/module1/resource test/module2

これに対して、pythonのsymlink関数ではシンボリックリンクのファイル名を省略するとエラーとなるようです。

python symlink.py test/module1/resource test/module2
Traceback (most recent call last):
File "symlink.py", line 14, in
os.symlink(src, dst)
OSError: [Errno 17] File exists

また、シンボリックリンクの作成先に既に同名のファイルがある場合もエラーとなります。

(test/module2/symlinkfileが存在する状態で)
python symlink.py test/module1/resource test/module2/symlinkfile
Traceback (most recent call last):
File "symlink.py", line 14, in
os.symlink(src, dst)
OSError: [Errno 17] File exists

lnコマンドの場合は-fオプションで強制的に上書き出来ますが、symlink関数の場合はそういう指定はないようなので、一旦ファイルを削除->シンボリックリンク作成という流れになると思います。

以上です。