環境
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"