LoginSignup
3
3

More than 5 years have passed since last update.

実行ディレクトリの場所を固定しないスクリプトを書く

Last updated at Posted at 2018-05-21

自分で書いたスクリプトを見なおしてみると、そのスクリプトが置かれたディレクトリでしか動作しないスクリプトになっていることが多いものです。
ここでは、そのことを回避するちょっとした書き方の工夫を示します。

使用するデータの場所が見つからなくなることを防止する。

相対pathで記述してあるファイルの場所は、スクリプトの実行のさせ方によって動作できなくなります。
その様子を次のスクリプトで示します。

data_path.py
#!/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 が便利です。

3
3
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3