筆者について (about me)

私は普段、理系大学生をしており、物理を専攻しております。その中で大学2年生のときに python に触れ、その面白さに魅了されました。その後は主に python を使った deep learning を趣味として始め、様々な開発を行っております。その際にでたエラーなどの解決方法をこの What’s this ブログで詳しく解説しています。

解決策 (Solution)

解決策としては sys.path.append(‘..’) と加えるだけ!!

例えば、下の様なファイル構造で child_1 にいる caluc.py から parent にいる add.py を参照したいときは sys をインポートして sys.path.append(‘..’) と加えるだけでOK

parent/
  |- add.py

child_1/
  |- calcu.py

(‘..’)が意味するところは今いるファイルの親ディレクトリに移動するという意味があるため、calcu.py から そのディレクトリである child_1 に移動して、そこと同じ階層にいる parent ディレクトリを参照してくる。そのために、calcu.py から add.py を呼びたせたのである。しかし、注意として、vs codeなどのエディタ上で実行する場合はうまくいかない。それを最後の方に記述する。

no module named 自作 エラーの例

def add(a,b):
    result = a + b
    return result

この parent ディレクトリにいる add.py を child_1 にいる calcu.py で呼びたすために

from parent import add

def sum(a, b):
    ans = add.add(a,b)
    return ans

print(sum(100, 500))

このコードをカレントディレクトリ(今私がいるディレクトリ) child_1で ターミナル上で実行すると

ModuleNotFoundError: No module named 'parent'

このようなエラーが起きる。この原因は、正しく parent ディレクトリの参照ができていないからである。

次に実行が成功したコードを示す。

エラーが起きないコード

import sys
sys.path.append('..')
# parentディレクトリーからadd関数をインポート
from parent import add

def sum(a, b):
    ans = add.add(a,b)
    return ans

print(f" ans : {sum(100, 500)}")

この様に sys をインポートして、sys.path.append(‘..’) と入れたコードを実行すると以下の様に正しい計算結果が得られる。

ans : 600

こうして、no module named 自作問題を解決することができました。

また、今回使った sysの用法については近いうちにまた、記事を出したいと思いますので、またこの What’s this ブログに立ち寄っていただけると嬉しいです。

付録 (Appendix)

今回は mac のターミナル上で行ったため、sys.path.append(‘..’) を行うと実行が成功しましたが、vs code のエディター上で実行すると下の様にエラーが起きてしまいました。上では成功したこの

mport sys
sys.path.append('..')
# parentディレクトリーからadd関数をインポート
from parent import add


def sum(a, b):
    ans = add.add(a,b)
    return ans

print(f" ans : {sum(100, 500)}")

コードを vs code 上で実行すると

ModuleNotFoundError: No module named 'parent'

というエラーが起きてしまいました。そのため sys.path.append(‘..’) を sys.path.append(‘.’) としてピリオドを1つなくすと

ans : 600

というふうに成功しました。

この理由はターミナル上では直接ファイルを指すことができず、ディレクトリを指してしまうため、ピリオドが2つないと実行が完了しないが、エディター上では直接ファイルを指すことができるため、ピリオドを2つ付けてしまうと親ディレクトリのさらなる親ディレクトリ、つまり、祖父母ディレクトリ(*私が勝手に名付けました)が参照されてしまうため、エラーになってしまうと考えられます。皆様もお気をつけください。

まとめ (Conclusion)

このように自作モジュールを import するときはファイルの構造を考えるのが重要です。そして、その後にそのファイルの場所を参照するために sys.path.append(‘..’) という1文を付け加えれば、悩んでいることが解決すると思うのでぜひ、実践してみてください!

参考 (Reference)

参考のために以下の記事を参考にしました。本当にありがとうございました!!

https://ja.stackoverflow.com/questions/61272/親ディレクトリに存在するパッケージのimportに失敗する

お問い合わせ