エンジニアリングとお金の話

都内で働くエンジニアの日記です。

【技術】pythonのインポートについて

【SPONSORED LINK】

pythonのインポートてよく分からなかったので調べてみた。

確認用モジュールのフォルダ構成

D:\WORK\PYTHON\TEST
│  main.py
│  __init__.py
│
└─ package
        sub.py
        __init__.py

main.pyからsub.pyを使用する為にインポートを行う。なお、sub.pyの中身はこんな感じ。

def dog(): 
    print "wan!wan!"

importによるインポート1(正常)

#-*- coding:utf-8 -*-

#パッケージ名.モジュール名を記述 
import package.sub 

#パッケージ名.モジュール名.関数名で呼び出す
package.sub.dog()

#実行結果
wan!wan!

importによるインポート2(エラー)

#-*- coding:utf-8 -*-

#パッケージ名を記述
import package 

#パッケージ名.モジュール名.関数名で呼び出す
package.sub.dog()

#実行結果
Traceback (most recent call last):
  File "D:\work\python\test\main.py", line 7, in <module>
    package.sub.dog()
AttributeError: 'module' object has no attribute 'sub'

importによるインポート3(エラー)

#-*- coding:utf-8 -*-

#パッケージ名.モジュール名.関数名を記述
import package.sub.dog 

#パッケージ名、モジュール名、関数名で呼び出す
package.sub.dog()

#実行結果
Traceback (most recent call last):
  File "D:\work\python\test\main.py", line 4, in <module>
    import package.sub.dog 
ImportError: No module named dog

fromによるインポート1(正常)

#-*- coding:utf-8 -*-

#from:パッケージ名、import:モジュール名を記述
from package import sub 

#モジュール名.関数名で呼び出す
sub.dog()

#実行結果
wan!wan!

fromによるインポート2(正常)

#-*- coding:utf-8 -*-

#from:パッケージ名.モジュール名、import:関数名を記述
from package.sub import dog 

#関数名で呼び出す
dog()

#実行結果
wan!wan!

fromによるインポート3(正常)

#-*- coding:utf-8 -*-

#from:パッケージ名.モジュール名、import:*を記述
from package.sub import * 

#関数名で呼び出す
dog()

#実行結果
wan!wan!

fromによるインポート3(エラー)

#-*- coding:utf-8 -*-

#インポート時:from‐パッケージ名、import:モジュール名.関数名を記述
from package import sub.dog 

#関数名で呼び出す
dog()

#実行結果
File "D:\work\python\test\main.py", line 4
    from package import sub.dog
                           ^
SyntaxError: invalid syntax

fromによるインポート4(エラー)

#-*- coding:utf-8 -*-

#from:パッケージ名、import:*を記述
from package import * 

#モジュール名.関数名で呼び出す
sub.dog()

#実行結果
Traceback (most recent call last):
  File "D:\work\python\test\main.py", line 7, in <module>
    sub.dog()
NameError: name 'sub' is not defined

まとめ

importでインポートを行う時は、パッケージ名.モジュール名を宣言する。使用する時はパッケージ名.モジュール名.関数名で呼び出す。

fromでインポートを行う時は2種類書き方がある。一つ目はfromにパッケージ名、importにモジュール名を宣言するパターン。この場合使用する際はモジュール名.関数名で呼び出す。二つ目はfromにパッケージ名.モジュール名、importに関数名を宣言するパターン。この場合使用する際は関数名で呼び出す。

整理してみてやっと理解出来た。やっぱり手を動かす事が大切だな。