python
์ ๊ณต๋ถํ๋ค๊ฐ ๋ณด๋ ๋นผ๋์ ์ ์๋ ๊ณ ๊ธ(?)๊ธฐ์ ์ด ์๋ค. ๋ฐ๋ก import
, from
์ผ๋ก ์ด๋ฃจ์ด์ง ๋
์๋ค๊ณผ modules
, path
!
์ค๋์ ์ด ๊ฐ๋ ๋ค์ ์์ ์ ๋ณต ํด๋ณด๋ ค ํ๋ค!
ํ์ด์ฌ์์ ๋ชจ๋์ ๋ณ์๋ ํจ์ ๊ทธ๋ฆฌ๊ณ ํด๋์ค ๋ฑ์ ๋ชจ์๋์ ํ์ผ
์ฐ๋ฆฌ๋ len(list)
๊ฐ์ ๋ด์ฅ ํจ์๋ฅผ ์ธ๋ len
์ ์ ์ธํ์ ์ ์์ง๋ง ์ ์จ์๋ค. ์ด๋ฏธ ํ์ด์ฌ์์ ๋ชจ๋๋ก ๊ตฌํํด๋์๊ธฐ ๋๋ฌธ!
๊ทธ๋ฅ ํ์ผ์ ๋ง๋ค๊ณ ๊ทธ ์์ ์ฌ์ฌ์ฉํ๊ณ ์ถ์ ํจ์๋ ํด๋์ค ํน์ ๋ณ์๋ฑ์ ๊ตฌํํ๋ฉด ๋๋๊น!
## my_module_file.py
def my_module():
...
def your_module():
...
class my_class():
...
์ด๋ ๊ฒ ๋ง๋ ํ์ import <๋ชจ๋์ด๋ฆ>.<๋ชจ๋์์ ์ฌ์ฉํ๊ธธ ์ํ๋ ๋ณ์/ํจ์/ํด๋์ค ์ด๋ฆ>
์ผ๋ก ๋ถ๋ฌ์ค๋ฉด ๋๋ค!
import my_module_file
# ํจ์ ์คํ
my_module_file.my_module()
from
์import
๋ณด๋ค ํฐ ๊ฐ๋ ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค. ์์ ์์์์ ์ฐ๋ฆฌ๋my_module()
ํจ์๋ฅผ ์คํํ๊ธฐ ์ํดmy_module_file.my_module()
์ด๋ผ๊ณ ๊ธธ๊ฒ ์จ์ผ๋ง ํ๋๋ฐ,from
์ ์ฐ๋ฉด ๊ฐ๋จํ ํ ์ ์๋ค.
from my_module_file import my_module
# ํจ์ ์ฌ์ฉ
my_module()
# ํจ์ ์ฌ์ฉ x -> ์๋ฌ
your_module()
from
์ ๋ชจ๋์ ํฐ ๋ฉ์ด๋ฆฌ๋ฅผ ๊ฐ์ ธ์ค๊ณ , import
๋ก ์์ ๋ฉ์ด๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํ๋ ๊ฒ๊ณผ ๊ฐ๋ค. ์ด๋ ๊ฒ ์ฐ๋ฉด ํจ์๋ฅผ ๊ฐ๋จํ ์ธ ์ ์์ง๋ง ๋ฌธ์ ์ ์ด ์๋ค.
2๋ฒ์งธ ํจ์์ธ your_module()
์ import
๋ก ๊ฐ์ ธ์ค์ง ์์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ ์ ์๋ ๋จ์ ์ด ์๋ค. ๊ทธ๋ผ ํด๋น ๋ชจ๋์ ๋ชจ๋ ํจ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ ์ด๋ป๊ฒ ํด์ผํ ๊น?
๋ฐ๋ก *
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ!
from my_module_file import *
# ํจ์ ์ฌ์ฉ
my_module()
your_module()
*
์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๋ชจ๋ ํจ์๋ฅผ ์ฌ์ฉํ๊ฒ ๋ค๋ผ๋ ๋ป์ด๋ค. ํ์ง๋ง ๊ธฐ์กด์ ์์ฑํ๋ ํจ์๋ช
, ๋ณ์๋ช
๊ณผ ๊ฒน์ณ์ ์ถฉ๋์ด ๋ ์ ์๊ธฐ์ ์ ํธํ์ง๋ ์๋๋ค.
๋ ๊ฐ๋จํ ๊ตฌํํด ๋ณด๋ฉด as
๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ์นญ์ผ๋ก ๋ด๊ฐ ๊ธฐ์ตํ๊ณ ์ฌ์ฉํ๋๋ฐ ๋ ํธ๋ฆฌํ๊ฒ ํ ์ ์๋ค.
from my_module_file import my_module as my
# my_module() ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์
my()
์ด๋ ๊ฒ as
๋ค์ ๋ณ์นญ์ผ๋ก ๋ง๋ค์ด ์ฌ์ฉํ ์ ์๋ค.(์์ ๊ฐํธ!!)
์ง์ง from
, import
, as
๋ง์ผ๋ก๋ ๋ฌต์ ์ฒด์ฆ์ด ํ
๋ด๋ ค๊ฐ ๊ฒ ๊ฐ๋ค!ใ
ใ
ใ
ใ
ใ
๐
Packages
๋Module
๊ณผ ๊ฐ์ ๊ฐ๋ ์ด์ง๋ง,Module
๋ก ๋๋๊ธฐ์ ๋๋ฌด ํฌ๊ฑฐ๋ ๋นํจ์จ์ ์ผ๋ ์ฌ์ฉํ๋ค.
๋ง ๊ทธ๋๋ก ํ๋์ ํด๋๊ฐ ํ๋์ ํจํค์ง๊ฐ ๋๊ณ , ๊ทธ ํจํค์ง์ ์ด๋ฆ์ด ํด๋ ์ด๋ฆ์ด๋ค.
# ๋๊ฐ์ด ์ฌ์ฉ!
import pkg.mod1
from pkg.mod2 import func2
pkg.mod1.func1()
func2()
์ฐธ ์ฝ์ฅฌ?๐
๋ง์ฝ์ ์ง๊ธ abc
๋ผ๋ ๋ชจ๋ ํน์ ํจํค์ง๋ฅผ import
ํด์ผํ๋ค๋ฉด, ํ์ด์ฌ์ ์ด๊ฒ์ ์ด๋ค ์์๋ก ์ฐพ์๊น?
๋ฐ๋ก sys.modules
-> built-in modules
-> sys.path
์์ผ๋ก ์ฐพ๋๋ค!
ํ์ด์ฌ์ด ๊ฐ์ฅ ๋จผ์ ํ์ธํ๋ ๊ณณ์ด๋ค.
sys.modules
๋ ๋จ์ํ ํด๋์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฏธimport
๋ ๋ชจ๋๊ณผ ํจํค์ง๋ค์ ์ ์ฅํ๊ณ ์๋ค.
์ฆ, ํ๋ฒ import
๋ ๋ชจ๋๊ณผ ํจํค์ง๋ค์ ํ์ด์ฌ์ด ๋ ๋ค์ ์ฐพ์ง ์์๋ ๋๋ค๋ ๋ป! (์๋กญ๊ฒ import
ํ๋ ๋ชจ๋๊ณผ ํจํค์ง๋ ์ฐพ์ ์ ์๋ค...๐ซ)
ํ์ด์ฌ์์ ์ ๊ณตํ๋ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค. ์ด๋ฏธ ํฌํจ๋์ด ์์ผ๋ ํ์ด์ฌ์ด ์ฝ๊ฒ ์ฐพ์ ์ ์๋ค.
sys.path
๋list
ํ์ ์ผ๋กstring
์ผ๋ก ์ด๋ฃจ์ด์ง ๊ฒฝ๋ก๋ฅผ ํฌํจํ๊ณ ์๋ค. ์ฌ๊ธฐ์๋ ์ฐพ์ง ๋ชปํ๋ค๋ฉดModuleNotFoundError
๋ฅผ ๋ฆฌํดํ๋ค.
# sys.path์ ํํ
['',
'/Users/song-eun-u/anaconda3/bin',
'/Users/song-eun-u/anaconda3/lib/python36.zip',
'/Users/song-eun-u/anaconda3/lib/python3.6',
'/Users/song-eun-u/anaconda3/lib/python3.6/lib-dynload',
'/Users/song-eun-u/anaconda3/lib/python3.6/site-packages',
'/Users/song-eun-u/anaconda3/lib/python3.6/site-packages/aeosa',
'/Users/song-eun-u/anaconda3/lib/python3.6/site-packages/IPython/extensions',
'/Users/song-eun-u/.ipython']
์์๋ ๋๋ต ์์๊ณ ... ๊ทธ๋ ๋ค๋ฉด ์ฐพ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ผ๊น??
์ ๋ง ๊ฐ.๋จ.ํ. ๋งํ์๋ฉด,
์ ๋๊ฒฝ๋ก(Absolte path)
๋ ๋ด ํ๋ก์ ํธ ๋ช ๋ถํฐ ์์ํด์ ํธ๋ฆฌํํ๋ก ์ด๋ฃจ์ด์ง ์์๋๋ก ์ด๋ฃจ์ด์ง๋ค!
์๋๊ฒฝ๋ก(Relative path)
๋ ๊ฐ์ ํจํค์ง ์์ ์๋ค๋ ๊ฐ์ ํ์.
์ผ๋ก ์ ๊ทผํ ์ ์๋ค!
# ์ ๋๊ฒฝ๋ก
# module5์ func1์ ์ ๊ทผํ๋ค๋ ๊ฐ์
# my_app์ด๋ผ๋ ํ๋ก์ ํธ๋ช
์ ์ต์๋จ ๊ฒฝ๋ก๋ก ๋ฐ๋์ง ์๊ธฐ์ ์๋ต๊ฐ๋ฅ
from package2.subpackage1.modeuls5 import func1
# ์๋๊ฒฝ๋ก
# ํ์ฌ package2์ ์๊ณ , module3์ class3์ ์ ๊ทผํ๋ค๋ ๊ฐ์
# ..์ ์์ ํด๋๋ก ์ด๋
from .module3 import class3
์ค๋์ ์ ๋ง ์ฌ์ด๊ฒ๋ค๋ง ๋ฐฐ์๋ดค์ผ๋ ๋ง์ง๋ง ์ ๋ฆฌ ํ๊ณ ๋๋ง์น๋๋ก ํ์!ใ
ใ
ใ
ใ
(๊ฑฐ์ ์ ๊ฑฐ์ ํด.)
sys.modules
๋ ์ด๋ฏธ import
ํ๊ฒ๋ค์ด ์๊ณ , ์ ์ผ ๋จผ์ ๊ฒ์.
sys.path
๋ list
ํ์
์ผ๋ก ๊ฒฝ๋ก๊ฐ string
์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , ์ ์ผ ๋ง์ง๋ง์ ๊ฒ์
sys
๋ ํ์ด์ฌ์ ํฌํจ๋์ด ์๋ ๋ชจ๋์ด๊ธฐ์ ๋๋ฌธ์ ์ฐพ์ ์ ์๋ค.
Absolute path
๋ ์ต์๋จ์ ํ๋ก์ ํธ ๋ช
์ผ๋ก ์์ํ์ฌ ํจํค์ง๋ฅผ ์ปค์ณ ํ์ผ, ํจ์ ๋ฑ ์ฌ๋ฌ๊ฐ์ง์ ์ ๊ทผํ๋ ๋ฐฉ์์ด๊ณ ,
Relative path
๋ ํ์ฌ ํด๋์์ ์์ํ์ฌ ๊ฐ์ ์์น์ ์๋ค๋ฉด .
์ผ๋ก ์ ๊ทผ, ์์ ํด๋์ ์๋ค๋ฉด ..
์ผ๋ก ์ ๊ทผํ๋ ๋ฐฉ์์ด๋ค.
# absoulte path
#from calculator.add_and_multiply import add_and_multiply
# relative path
from .calculator.add_and_multiply import add_and_multiply
if __name__ == '__main__':
print(add_and_multiply(1,2))
๊ฒ์ ์ด๋ฏธ์ง์ฒ๋ผ ํด๋๊ตฌ์ฑ์ด ๋์ด ์์๋ ์ ์ฝ๋๋ฅผ ์งํํ๋ฉด ์๋์ ์๋ฌ๊ฐ ๋๋ค.
๊ณต์ ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด
Note that relative imports are based on the name of the current module. Since the name of the main module is always "main", modules intended for use as the main module of a Python application must always use absolute imports.
์ด๋ ๊ฒ ๋์ค๋๋ฐ ์ด ๋ง์ ์ฆ,
์๋ ๊ฒฝ๋ก๋ก import๋ฅผ ์๋ํ ๋ ํ์ฌ module์ ์ด๋ฆ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค. main module์ ์ด๋ฆ์ ํญ์
__main__
์ด๊ธฐ ๋๋ฌธ์ ์ ๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
์ฐ๋ฆฌ๋ ์๋๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ํ๋๋ ๋ฌธ์ ์ด๋ค.
# ์ ๋๊ฒฝ๋ก
from calculator.multiplication import multiply
# ์๋๊ฒฝ๋ก
from .multiplication import multiply
๊ฒฐ๋ก ์ ๋ ๋ค ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ!
๋ค๋ง, ์ฐจ์ด์ ์ด๋ผ๋ฉด ์๋๊ฒฝ๋ก๊ฐ ๊ฐ์ packages
์์์๋ผ๋ฉด ํจ์ฌ ๊ฐ๋จํ๊ฒ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด๋ค.
์ง๊ธ๊น์ง ์ด์ฌํ ๋ฐ๋ผ์จ ๋์ ์ด๊ธ์ ๋ณด๋ ๋น์ ์ ์นญ์ฐฌํด...!๐
from
, import
, as
์ ๋ช
ํํ ์ฌ์ฉ__main__
์์๋ ์ ๋๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ์!!์ด๋ ค์ด ๊ฐ๋ ??? ๋์๊ฒ ๊ทธ์ ๋ฐฅ ๋ง์์ ํ๋ฃจ๋ฃฉ! ๋-๋ฑ- ํ๋ ์ผ ์ผ๋ฟ...๐๐ซ