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関数の場合はそういう指定はないようなので、一旦ファイルを削除->シンボリックリンク作成という流れになると思います。
以上です。