はじめに
Python初学者のわたしが覚えるために、学んだことを整理し、理解を深めるために記事を書いています。
今回はお隣のフォルダの中にあるファイルをimportしたい!
このsys.path.append()で書かれたコードを見たときは呪文なのか!?と思いました😱
Pythonでは同じフォルダ内にあるファイルしかimportできない!
全然知りませんでした😱
隣のフォルダ内にファイルを呼び出そうとするとエラーになります!
- プロジェクト(ルートディレクトリ)
- google_apis
- sheets_reader.py ← 今ここにいる
- utils
- logger.py ← これをimportして使いたい!
- google_apis
【エラー実証】
#sys.path.append()は使わずにimport
from utils.logger import SimpleLogger
class User:
def __init__(self):
self.logger_setup = SimpleLogger()
self.logger = self.logger_setup.get_logger()
self.logger.info("本当にこれは表示されないのか?")
user = User()
#ターミナルにこのエラーがでました!
ModuleNotFoundError: No module named 'utils'
実際にsys.path.append()を使用しなかったら、ターミナルにエラーが出ました!
本当にエラーが出ることが分かり、必要なんだと分かりました!
【sys.path.appendを使用して実証】
次はsys.path.append()を使用すると本当にimportできるようになるのか?
import os
import sys
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "../")))
from utils.logger import SimpleLogger
class User:
def __init__(self):
self.logger_setup = SimpleLogger()
self.logger = self.logger_setup.get_logger()
self.logger.info("今度は本当に表示できました!")
user = User()
#ターミナルにはちゃんと表示されました
- INFO - 今度は本当に表示できました!
なるほど!勉強になりました!
あとはsys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "../")))ですね!なぞの呪文にしか見えません😱
①今いるファイルを教える:sheets_reader.py
(__file__)
②入っているフォルダを教える:google_apis
os.path.dirname(オーエス・パス・ディレクトリーネーム)
※(__file__)って①で教えたから、フォルダ名を書かなくてもここが今いるフォルダだって分かってくれる!
③行きたいフォルダを教える
os.path.join(..., "../")
※"../"は親フォルダにあるよって教えている
④ここでプロジェクト(ルートディレクトリ)からの道を確定
os.path.abspath(...)(オーエス・パス・アブソリュートパス)
⑤Pythonがimportできるように教える
sys.path.append(...)
まとめ
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "../")))がなければお隣のフォルダのファイルをimportできないことが分かりました!
コードは左から書くのに、自分がいるファイルから逆算して考えるので、「書く方向」は「左から」で「考える方向」は
「右から」で不思議な感じがします!
これにも慣れるように反復したいと思います!