LoginSignup
11

More than 3 years have passed since last update.

posted at

python モジュールimport方法について

importとかfromとかよく使うけどなんとなくで使っていてよくわかっていないのでまとめる.

pythonだとpath周りとかかなりめんどくさい印象があるけどそれをなんとかできたらいいな

大部分を入門python3から学んでいます.

インポート方法まとめ

Left align Right align
モジュールを読み込む import module
モジュールからメソッド,クラスを読み込む from module import method, class
パッケージからモジュールを読み込む from package import module
パッケージの中のモジュールのメソッド,クラスを読み込む from package.module import method, class

基本的にこの四種類.
これを無意識に使えるようになれば良い.

モジュールとは

pythonコードをまとめたファイルのこと.

モジュールを利用する際にはimportを使う.
main.pyからmodule.pyを利用したい場合は

main.py
import module # ここは~~.pyの~~だけを書く 

module.hello_world()
module.py
def hello_world():
    print('hello world!')

これだけ.main.pyを実行すると

hello world!

module.pyのhello_world関数が実行される.
これが基本形になる.

各種パターン

メソッドだけインポートする場合

さきほどのパターンでhello_world関数だけインポートしたい場合,
from ~~.py import メソッド名
で関数をインポートできる.

main.py
from module import hello_world

hello_world()

これで先ほどと同様に実行できる.

ディレクトリ配下のモジュールをインポートしたい場合

.
|____main.py
|____child1
  |____child.py

このようなディレクトリを設定する.

main.pyからchild.pyをインポートしたい場合,

main.py
# ディレクトリ.モジュール で指定
import child1.child

child1.child.child_hello()

このように読み込むことができる.基本的にどれくらいネストされていてもディレクトリ..
のようにドットをつなげることで階層を潜っていくことができる.

そもそもどうやってモジュールを探しているのか

結論: sysモジュールのpathに指定されているディレクトリなどを順に参照していく

main.py
import sys

for path in sys.path:
    print(path)

こんな感じでsys.pathに登録されているpathを順に表示させる.
そうすると

/pythonTutorial3/study-module
/.pyenv/versions/3.6.0/lib/python36.zip
/.pyenv/versions/3.6.0/lib/python3.6
/versions/3.6.0/lib/python3.6/lib-dynload
/.pyenv/versions/3.6.0/lib/python3.6/site-packages

このように登録されているpathが返ってくる.
モジュールをインポートする際はこれらのパスを順にみていって一致するモジュールがあるかどうかを検索しているらしい.

注意点としてpath上に同名pyファイルが存在する場合は最初にマッチしたファイルを読み込む
.
なので同名ファイルを複数作成している場合は注意が必要.

一つ上の階層のモジュールを読み込む方法

よくあるパターンとして,一つ上の階層のファイル,ディレクトリにあるモジュールを読み込みたい時がある.

これも先ほどの学んだsys.pathを順に探す.というルールを理解していれば簡単になる.
要するにsys.pathに親階層を追加すればいい.

child.py
import sys

# 一個上の階層をpathに追加
sys.path.append('../')

for p in sys.path:
    print(p)

# ../module.pyを読み込む
import module
module.hello_world()

パッケージについて

パッケージとは_init_.pyを持っているディレクトリのこと.
モジュールとパッケージは名称は違うが,扱い方はほとんど同じ,ディレクトリかファイルかの違いだけと思ってもよい

まとめ

  • 処理上ではimport ~~ の~~の部分だけ使えると思っておけばいい
  • moduleの読込先はsys.pathに登録されているpathを順に読み込む
  • 上の階層などを読み込みたいときはsys.path.appendでpathを追加する

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
What you can do with signing up
11