環境
Python 3.8.10
初めに
研究で自作モジュールのimportが上手くいかなった時の記録をメモ。
ディレクトリ構成は以下。
先に結論
自作モジュール自体が他の自作モジュールをimportする場合、実行したいファイルにおいて、利用する全ての自作モジュールのパス(実行したいファイルからの相対パス)を通す必要がある。
反対に、他の自作モジュールをimportしている自作モジュールでは、パスを通す必要はない。
パスが通らない様子
clustering.ipynb
の最初のセルは以下のようになっていて、上位ディレクトリのclustering_util.py
をimportしたい。
import sys
sys.path.append("../")
import clustering_util as cutils
sys.path.append("../../utils/")
from util import *
また、clustering_util.py
のimportは以下のようになっていて、util.py
をimportしたい。
import sys
sys.path.append("../utils/")
from util import *
つまり、clustering.ipynb
の最初のセルを実行すると、clustering_util.py
が読み込まれ、clustering_util.py
はutil.py
を読み込むことを期待している。
ただ、このままclustering.ipynb
の最初のセルを実行すると
Cell In[1], line 13
---> 13 import clustering_util as cutils
File clustering_util.py:13
---> 13 from util import *
ModuleNotFoundError: No module named 'util'
となる。
原因
原因は至ってシンプルで、実行するclustering.ipynb
の最初のセルにおいて、util.py
にパスが通っていない状態でclustering_util.py
が読み込まれ、clustering_util.py
でutil.py
の読み込みに失敗していることである。
つまり、clustering_util.py
ではutil.py
に対してパスを通す必要はなく、実行したいclustering.ipynb
においてパスを通してあげる必要がある。
解決策
clustering.ipynb
の最初のセルにおいて、clustering_util.py
をimportする前にutil.py
へのパスを通す。
import sys
sys.path.append("../")
sys.path.append("../../utils/") # 先にパスを通す
import clustering_util as cutils
from util import *
また、clustering_util.py
ではutil.py
に対してパスを通す必要はない。
import sys
#sys.path.append("../utils/") 必要ない
from util import *
最後に
初めて書く記事で大変見づらいと思いますが、誰かの助けになれば幸いです。
また研究で困ったことがあれば書いていこうと思います。