tapitapi’s blog

1日1杯タピオカ!エンジニア

【Python】 違うディレクトリにパスを通す

 下記の様なディレクトリ構成で、test1.py を実行する時、別ディレクトリのファイル(common/logger.py)を参照する様にパスを通す方法

.

|____common

|             |_logger.py

|             |_ __init__.py

|____test

              |_ test1.py

              |_ __init__.py

 

common/logger.py: ログを出すための処理を共通化するためのファイル

from logging import getLogger, StreamHandler, Filter, basicConfig, DEBUG

class Log:
   def init_logger(name):

     logger = getLogger(name)

    #ログをコンソール出力するための設定
    sh = logging.StreamHandler()
    logger.addHandler(sh)

    return logger

 

test/test1.py

import os
import sys

sys.path.append(os.path.dirname(os.path.abspath(os.path.dirname(__file__))))
from common.logger import Log

 

if __name__ == "__main__":
lg = Log.init_logger(__name__)
lg.info('**** TEST1 ****')

 

これで、python test/test1.pyを実行すると、コンソール上に**** TEST1 **** が表示されます。

 

上記赤文字の部分が何をしているか、下記で説明:

 

*__file__: 実行したファイル test/test1.pyを取得

 

*os.path.dirname(__file__): __file__のディレクトリ test を取得

 

*os.path.abspath(os.path.dirname(__file__)): testの絶対パス取得(/Users/username/Desktop/~~/repo_root/test)

 

*os.path.dirname(os.path.abspath(os.path.dirname(__file__))):testの絶対パスディレクトリ取得

(/Users/username/Desktop/~~/repo_root)

 

*sys.path.append(os.path.dirname(os.path.abspath(os.path.dirname(__file__)))):検索用パスsys.pathに、

testの絶対パスディレクトリ(/Users/username/Desktop/~~/repo_root)を登録

 

上記実行後、sys.pathは下記の様になります。

['/Users/username/Desktop/~~/repo_root/test', '/Users/username/.pyenv/versions/3.7.6/lib/python37.zip', '/Users/username/.pyenv/versions/3.7.6/lib/python3.7', '/Users/username/.pyenv/versions/3.7.6/lib/python3.7/lib-dynload', '/Users/username/.pyenv/versions/3.7.6/lib/python3.7/site-packages', '/Users/username/Desktop/~~/repo_root']

 

これで、青文字部分

from common.logger import Log

 

を探しに行くようになります.

まず、sys.pathの上から順に検索するので、

*実行したファイルと同じディレクトリ(/Users/username/Desktop/~~/repo_root/test)内に、common/logger.pyが存在するか見に行きます。

 

*存在しない場合は、pipなどでインストールしたファイルが格納されているフォルダ内(/Users/username/.pyenv/versions/3.7.6/lib/python37.zipなど)にcommon/logger.pyが存在するか見に行きます。

 

*更に存在しない場合は、先ほど赤文字部分でappendしたディレクトリ(/Users/username/Desktop/~~/repo_root)見に行きます。

 

この方法によって、一つ上のディレクトリ配下のファイルを参照できるようになりますー!

 

更に深くネストしたファイル内で参照する場合はos.path.dirnameを増やすことで、二つ三つ上のディレクトリ配下のファイルも参照できます。

 

以上です

 

おやすみなさい