0
1

More than 1 year has passed since last update.

VSCode Python importエラー 上の階層の自作モジュールをインポートしたい

Last updated at Posted at 2022-01-23

環境

windows 10
pyenv-win
python 3.9.6

ue_no_direcotryはどこ? (Pythonの気持ち)

importはsys.path上に存在するパスから相対パスで目的のモジュールを探索するため、sys.pathに存在しないパス(パスが通っていない)自作モジュールなどではで上の階層(ue_no_direcotry:この記事のヒロインの居場所)を探索することができない。
標準モジュールやサードパーティーモジュールがどこからでもインポートできるというのは、それらのモジュールがsys.pathの下の階層にインストールされているからである。

そうなんです、sys.pathの下の階層にあるモジュールならどこからでもインポートできるということなのです!当たり前のようなことですが、重要なことなので2回繰り返しました。ここでつまずいている人はこのことが理解できていないのだと思います。

ルートのパスで実行すると
import sys
print(sys.path)
sys.pathの実行結果
['c:\\Users\\yourname\\lessons\\python_lessons\\ue_no_directory\\current_root',
 'c:\\Users\\yourname\\.vscode\\extensions\\ms-toolsai.jupyter-2021.11.1001550889\\pythonFiles',
 'c:\\Users\\yourname\\.vscode\\extensions\\ms-toolsai.jupyter-2021.11.1001550889\\pythonFiles\\lib\\python',
 'C:\\Users\\yourname\\.pyenv\\pyenv-win\\versions\\3.9.6\\python39.zip',
 'C:\\Users\\yourname\\.pyenv\\pyenv-win\\versions\\3.9.6\\DLLs',
 'C:\\Users\\yourname\\.pyenv\\pyenv-win\\versions\\3.9.6\\lib',
 'C:\\Users\\yourname\\.pyenv\\pyenv-win\\versions\\3.9.6',
 '',
 'C:\\Users\\yourname\\.pyenv\\pyenv-win\\versions\\3.9.6\\lib\\site-packages',
 'C:\\Users\\yourname\\.pyenv\\pyenv-win\\versions\\3.9.6\\lib\\site-packages\\win32',
 'C:\\Users\\yourname\\.pyenv\\pyenv-win\\versions\\3.9.6\\lib\\site-packages\\win32\\lib',
 'C:\\Users\\yourname\\.pyenv\\pyenv-win\\versions\\3.9.6\\lib\\site-packages\\Pythonwin']

現在のルートのツリーは以下の通りで、sita_no_moudle.pyからue_no_module.pyをインポートしとうとする。繰り返しになるが、パスが通っていないため相対パスで探索するimportではインポートすることができない。

current-root
ue_no_directory
├── ue_no_module.py
├── current_root 
│   ├── sita_no_module.py ← いまここにいるよ!
current_root/sita_no_module.py
# 現在のsys.path
current_sys_path = sys.path[0]
print(current_sys_path)
# 上のディレクトリpath
sp = os.sep  # パスの区切り文字を取得 (windowsなら\\, linxuなら/)
ue_no_dir_path = sp.join(current_sys_path.split(sp)[:-1])
print(ue_no_dir_path)
# sys.pathに上のディレクトリpathを追加
sys.path.append(ue_no_dir_path)
# パス追加後のsys.path
print(sys.path)

import ue_no_module
短い書き方
sys.path.append(os.sep.join(sys.path[0].split(os.sep)[:-1]))
import ue_no_module

おまけ

パスが汚れてしまうけど、このやり方もありです
入力し終わったらログアウトしてね!

windows
win+r sysdm.cplと入力 > advanced > new user variable > パス名: PYTHONPATH  追加したいパス
linux
export PYTHONPATH="<追加したいパス>:$PYTHONPATH"
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1