プログラムが長くなってきますと、プログラムを複数のファイルに分け、最初に起動するファイル、読み込んで使うファイル、というように管理した方がわかり易い場合が多いです。
そこで今回はインポートについて見ていきます。
なおモジュールとは、Pythonのコードが書かれたファイルという意味です。
同階層、同じフォルダ、同じディレクトリ内でのインポート
この場合は簡単で、モジュール名(abcdefg.pyというファイルでしたら、拡張子を除いた「abcdefg」がモジュール名)でインポートするだけです。
import abcdefg
abcdefgモジュールの変数や関数が使えます。abcdefg.変数名、abcdefg.関数名というように、最初にabcdefg.をつけてアクセスします。
import モジュール名 as 別名
例えば、このようにインポートすると、別名がつけられます。
import abcdefg as hage
この場合、別名でアクセスできます。
hage.変数名、hage.関数名というように、最初にhage.をつけてアクセスできます。
from モジュール名 import 変数名(または関数名またはクラス名または*)
このパターンを使いますと、モジュール名.変数名という書き方でなく、直接「変数名(または関数名またはクラス名)」だけでアクセスできます。
アスタリスク*を使いますと、すべての変数名(または関数名またはクラス名)をモジュール名.をつけないでアクセスできます。
別階層、別フォルダ、別ディレクトリのインポート
違う階層のモジュールをインポートする時は、sys.path.appendで対象フォルダの絶対パスを追加してから、モジュール名でインポートします。
まずsysをインポート。
import sys
そして、Windowsでの例ですが、インポートするモジュールがあるフォルダまでの絶対パスを追加します。
sys.path.append(r”C:\Users\****\****\test”)
それからモジュール名でインポート
import hogehoge
この場合、testフォルダの中にhogehoge.pyというファイルがあり、それをインポートするという意味です。
簡単な例
例えばこのような階層に、4つのファイルがあるとします。
test1/
├ test1.py
├ test1_2.py
└ test2/
├ test2.py
└ test3/
└ test3.py
test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# 同階層はモジュール名のみでインポート import test1_2 import sys # 違う階層はsys.path.appendで対象フォルダの絶対パスを追加 sys.path.append(r"C:\Users\ファイルまでの絶対パス\test1\test2") # それからモジュール名でインポート import test2 # 同上 sys.path.append(r"C:\Users\ファイルまでの絶対パス\test1\test2\test3") # 同上 import test3 def func(): print("test1") if __name__ == "__main__": func() test1_2.func() test2.func() test3.func() |
結果
test1
test1_2
test2
test3
test1_2.py
1 2 3 4 5 6 |
def func(): print("test1_2") if __name__ == "__main__": func() |
結果
test1_2
test2.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import sys sys.path.append(r"C:\Users\ファイルまでの絶対パス\test1") import test1 sys.path.append(r"C:\Users\ファイルまでの絶対パス\test1\test2\test3") import test3 def func(): print("test2") if __name__ == "__main__": func() test1.func() test3.func() |
結果
test2
test1
test3
test3.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import sys sys.path.append(r"C:\Users\ファイルまでの絶対パス\test1") import test1 sys.path.append(r"C:\Users\ファイルまでの絶対パス\test1\test2") import test2 def func(): print("test3") if __name__ == "__main__": func() test1.func() test2.func() |
結果
test3
test1
test2
if __name__ == “__main__”:
if __name__ == “__main__”:は、そのファイルがインポートでなく、直接実行されたらという意味です。
これは、プログラムのファイルがたくさんあった場合でも、一ファイルごとに実行して動作を検証できるので、とても便利です。