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を利用したい場合は
import module # ここは~~.pyの~~だけを書く
module.hello_world()
def hello_world():
print('hello world!')
これだけ.main.pyを実行すると
hello world!
module.pyのhello_world関数が実行される.
これが基本形になる.
各種パターン
メソッドだけインポートする場合
さきほどのパターンでhello_world関数だけインポートしたい場合,
from ~~.py import メソッド名
で関数をインポートできる.
from module import hello_world
hello_world()
これで先ほどと同様に実行できる.
ディレクトリ配下のモジュールをインポートしたい場合
.
|____main.py
|____child1
|____child.py
このようなディレクトリを設定する.
main.pyからchild.pyをインポートしたい場合,
# ディレクトリ.モジュール で指定
import child1.child
child1.child.child_hello()
このように読み込むことができる.基本的にどれくらいネストされていてもディレクトリ..
のようにドットをつなげることで階層を潜っていくことができる.
そもそもどうやってモジュールを探しているのか
結論: sysモジュールのpathに指定されているディレクトリなどを順に参照していく
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に親階層を追加すればいい.
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を追加する