自分で書いたスクリプトを見なおしてみると、そのスクリプトが置かれたディレクトリでしか動作しないスクリプトになっていることが多いものです。
ここでは、そのことを回避するちょっとした書き方の工夫を示します。
使用するデータの場所が見つからなくなることを防止する。
相対pathで記述してあるファイルの場所は、スクリプトの実行のさせ方によって動作できなくなります。
その様子を次のスクリプトで示します。
# !/usr/bin/python
# -*- coding: utf-8 -*-
import os
baseDir = os.path.dirname(__file__)
data = "data.txt"
if __name__ == "__main__":
fullpath = os.path.join(baseDir, data)
txt2 = open(fullpath, "rt").read()
print(txt2)
txt = open(data, "rt").read()
print(txt)
そのスクリプトの実行結果は次のとおりです。
# スクリプトがあるディレクトリでは、どちらの書き方でも動作します。
$ python data_path.py
Hello Python
Hello Python
$ cd ..
# スクリプトのないディレクトリでは、相対パスでの記述はエラーを生じます。
$ python data_path/data_path.py
Hello Python
Traceback (most recent call last):
File "data_path/data_path.py", line 13, in <module>
txt = open(data, "rt").read()
IOError: [Errno 2] No such file or directory: 'data.txt'
$
このような工夫で、スクリプトが安定して動かせる範囲が広がります。
追記;別手法
実行ディレクトリを固定し、入出力のディレクトリを絶対pathで指定する。
$ python someScript.py image.jpg
とスクリプトのディレクトリで、内部でこのディレクトリに対する相対pathでアクセスするデータファイルを用いているとしよう。
そのような場合には、他のディレクトリでこのようにしても動作しない。
$ python ~/script/someScript.py image2.jpg
これを次のように実装して回避することができる。
まず、実行時のディレクトリで、入出力を絶対pathに変換しておく。
そのうえで、スクリプト内部で
os.chdir(スクリプトの置かれているディレクトリ)
したうえで、本来の処理を入出力に絶対pathを指定して実行しよう。
そうすれば、この場合も、実行ディレクトリを気にせずに済むスクリプトになる。
Python3では
pathlib が便利です。