
Pythonを学び始めて一番最初に苦労したのは、fromとimportです。インポートのイメージができない。Excelから始めたので、参照設定でやっとピンときました。
Pythonの一番の強みはライブラリの豊富さです。自分で書いたコードすらもすべて扱うことができます。
そんな強みを上手に使うには、インポートの方法を知らないといけません。今回は自作Pythonの読み込みにフォーカスして備忘録します。
importのfromの部分難しい!

大きなコードになれば、同じような処理をするのに、Pythonファイルをまとめると思います。しかし、必ず同じ階層にファイルを用意できるわけではありません。
そんな時にどうすれば良いのか?
インポートの基本文
1 |
from モジュール名 from ファイル名(拡張子抜き) |
※from モジュール名は同一フォルダ内であれば、ファイル名だけでのインポートができます。
フォルダ構成
今回フォルダアドレスを調べるために実験環境を用意しました。もしも、理解を深めたければ、一緒に作ってみてください。
1 2 3 4 5 6 7 8 9 10 11 |
Folder0(参考フォルダ構成) ∟Test1.py ∟Folder1 ∟今回起動.py ∟Test2.py ∟Folder2 ∟Test3.py ∟Folder2-1 ∟Test4.py ∟Folder2-2 ∟Test5.py |
Folder0の中に、Folder1とFolder2を用意
Folder0には、Test1.pyを設置
Folder1には今回起動.pyとTest2.pyを設置
Folder2には、Test3.pyとフォルダ2つを設置
2つのフォルダはそれぞれナンバリングでFolder2_1とFolder2_2
2つのフォルダの中には、Test4.pyとTest5.pyがそれぞれ格納されている
起動は、今回起動.pyのためFolder1が軸となる
今回起動.pyの中身
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# 基本はアルファベット順 # =========================================================================# # 標準的なもの import sys # =========================================================================# # 公開されているライブラリのものをインポート # =========================================================================# # 自作をインポート # 同じディレクトリのため、そのままインポート import Test2 # 親ディレクトリに行くために必要な処理 sys.path.append('../') import Test1 from Folder2 import Test3 from Folder2.Folder2_1 import Test4 from Folder2.Folder2_2 import Test5 # ========================================================================= |
今回は、上位階層と下位階層に進めているが、上位階層へはエラーが出てしまいできませんでした。なので、sysで場所を変更してからインポート処理をしました。
Test(n).pyの中身
この(n)は、ナンバリングの話なので1~4の数字が入ります。ファイルの保管場所が変わるだけであり、内容はすべて同一の内容で作成します。
1 |
print(__file__) |
上記は、自分のファイルパスを出力します。
上位階層への指定はうまくいかなかった
上位階層を指定する方法はたくさん出ていました。しかし、結局私のできた方法はこの方法だけ。
エラーが起きたコードの紹介
1 2 3 4 5 |
import Test2 from .. import Test1 from ..folder2 import Test3 from ..Folder2.Folder2_1 import Test4 from ..Folder2.Folder2_2 import Test5 |
今回のエラーコード
1 |
ValueError: attempted relative import beyond top-level package |
..を使うと、戻るコード。つまりは上位階層へ戻るといろいろなサイトで紹介されていたが、僕はエラーコードが出てしまってできなかった。
なので、sysを使った方法に切り替えています。
まとめ
インポートは一番最初に面倒だと感じる部分です。ここまでインポートを行えるようになればだいぶ上級者なような気もする。がしかし、僕はこれを機にどんな場所にあってもインポートできる自信がつきました。
sysを使うのはなんか微妙なやり方だなぁ~と思うし、なんかきれいなコードではないように見えるのですが、今のところこのやり方が確実。
新しいやり方を見つけたらまたご紹介したいと思います。