はじめに
久しぶりにPythonを書いていたのですが、毎回Importの仕方で躓くなと感じたのでまとめていきたいと思います
問題
以下のディレクトリ構成があるとします
┣ app
┣ main.py
┣ driver
┣ get_driver.py
┣ gateway
┣ get_gateway.py
┣ test
┣ test_gateway.py
main.pyではgateway.py
を読み込んでいます
main.py
from gateway.get_gateway import GetGateway
main.pyではget_gateway.py
を呼び出します
gateway.pyではget_driver.py
を読み込みます
gateway.py
from driver.get_driver import GetDriver
ここでmain.py
からこのコードを実行するとmain.py
からみてfrom
のパスは相対パスになっているので問題なく動きます
┣ app
┣ main.py ←ここからみてる
┣ driver
┣ get_driver.py
┣ gateway
┣ get_gateway.py
┣ test
┣ test_gateway.py
しかしtest_gateway.py
はget_gateway.py
を直接読み込んで関数を実行しているため相対パス的にdriver
がないと言われます
┣ app
┣ main.py
┣ driver
┣ get_driver.py
┣ gateway ←ここからみてるので下の階層にdriverはないのでエラー
┣ get_gateway.py
┣ test
┣ test_gateway.py
このようにテストとmainでインポートがちぐはぐになってしまいました
これをなんとかしたいと思いました
解決方法
インポートのパスをみるときは全部app
から見るように設定することで解決しました
$ export PYTHONPATH=/root/src/app
これを実行することでうまく辻褄があうようになりました
私の環境はDockerなので以下のようにしました
docker-compose.yml
version: "3"
services:
app:
build: .
container_name: "app"
tty: true
working_dir: /root/src
volumes:
- ./src:/root/src
environment:
- PYTHONPATH=/root/src/app
おわりに
地味に躓いてしまいましたがChatGPTのおかげで解決できました
そのうちQiitaも不要になるのではないかと思いました