ํ์ด์ฌ์ ์ธ๋ถ์ ์๋ package๋ module์ ์ฌ์ฉํ๊ธฐ ์ํด์ import ํด์์ผ ํ๋ค. ํ์ด์ฌ ํ์ผ์ import ํ๊ธฐ ์ํด์๋ ํด๋น ํ์ด์ฌ ํ์ผ์ด๋ package ๋๋ ํ ๋ฆฌ๊ฐ ์ด๋์๋์ง ์ฐพ์ ์ ์์ด์ผ ํ๋ค.
๊ทธ๋ ๋ค๋ฉด, ํ์ด์ฌ์ ๋ชจ๋/package๋ฅผ ์ด๋ป๊ฒ ์ฐพ์๊น?
1 ~ 3 ์์ผ๋ก ์ฐพ๋๋ค.
์ด๋ฏธ imported๋ ๋ชจ๋๊ณผ packages์ ์ ์ฅํ๊ณ ์๋ dictionary ์ด๋ค. imported๋ ๋ชจ๋๊ณผ package๋ค์ ํ์ด์ฌ์ด ๋ ๋ค์ ์ฐพ์ง ์์๋ ๋๋๋ก ํ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค.
์๋ก importํ๋ ๋ชจ๋์ด๋ผ๋ฉด, sys.modules์์ ์ฐพ์ ์ ์๋ค.
ํ์ด์ฌ์ด ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ณ๋์ ์ค์น ์์ด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. import ํ๊ณ ์ ํ๋ module์ด sys.modules์ ์์ผ๋ฉด ๋ ๋ฒ์งธ๋ก buit-in module์์ ์ฐพ๋๋ค.
sys๋ built-in module์์ผ๋ก ์ด๊ธฐ์ import ๋ ์ ์๋ค.
import ํ๊ณ ์ ํ๋ package ์ฃผ์๋ฅผ string ํ์ ์ผ๋ก ์ ์ฅํ ๋ฐ์ดํฐ๋ฅผ ์์๋ก ๊ฐ์ง๊ณ ์๋ list์ด๋ค. importํ๊ณ ์ ํ๋ module์ด sys.modules์ built-in module์ ์๋ค๋ฉด, sys.path ์์ ์ค์ import ํ๊ณ ์ ํ๋ package๊ฐ ์ฃผ์๊ฐ ์๋์ง ํ์ธํ๋ค.
['',
'/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']
import ํ๊ณ ์ ํ๋ ์ฃผ์๋ฅผ ํํ ํ ๋, ๋ฃจํธ ๋๋ ํ ๋ฆฌ ๋ถํฐ ์ฃผ์๋ฅผ ์ ๋ ฅํ๋ ๋ฐฉ์ import ํ๋ ํ์ผ์ ์์น์ ์๊ด ์์ด ํญ์ ๋์ผํ ๊ฒฝ๋ก๋ก ํ์ ํ ์ ์๋ค.
import ํ๊ณ ์ ํ๋ module์ ์ฃผ์๋ฅผ ํ์ฌ ๋๋ ํ ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ์๋์ ์ผ๋ก ํํํ๋ ๋ฐฉ์
โโโ my_app
โโโ main.py
โโโ package1
โ โโโ module1.py
โ โโโ module2.py
โโโ package2
โโโ __init__.py
โโโ module3.py
โโโ module4.py
โโโ subpackage1
โโโ module5.py
๐ฏ absolute path๋ฅผ ์ด์ฉํด module5๋ฅผ importํ๊ธฐ
from package2.subpackage1 import module5
๐ฏ module3์์ relative path๋ฅผ ์ด์ฉํด module2๋ฅผ importํ๊ธฐ
from ..package1 import module2
๐ absolute path๋ฅผ ์ด์ฉํ๋ฉด ์ด๋์์๋ importํด๋ ๊ฒฝ๋ก์ ์๊ด์์ด ํญ์ ๊ฒฝ๋ก๊ฐ ๋์ผํ์ง๋ง, ๊ฒฝ๋ก๊ฐ ๊ธธ์ด ์ง ์ ์๋ค๋ ๋จ์ ์ด ์๋ค.
๐ relative path๋ ๊ฒฝ๋ก์ ๊ธธ์ด๊ฐ absolute path์ ๋นํด ์ ์ ์ ์์ง๋ง ํท๊ฐ๋ฆฌ๊ธฐ ์ฝ๋ค ๋ํ ํ์ผ ์์น๊ฐ ๋ณ๊ฒฝ๋๋ฉด, ์์ฑ๋ ๊ฒฝ๋ก๋ ์์ ํด ์ฃผ์ด์ผ ํ๋ ๋จ์ ์ด ์๋ค.
๋ ์๋ฅผ ๊ณฑํ ๊ฒ๊ณผ ๋ํ ๊ฒ์ ํฉ์น๋ ๊ฐ๋จํ ํจํค์ง๋ฅผ ๋ง๋ค์๋ค.
__init__.py
์ ์ญํ ์?
__init__.py
๊ฐ ์ํ ๊ณณ์ด ํจํค์ง ๋๋ ํ ๋ฆฌ์์ผ๋ก ์๋ ค ์ฃผ๋ ์ญํ ์ ํ๋ค. python 3.3 ๋ฒ์ ๋ถํฐ __init__.py ํ์ผ์ด ์์ด๋ ํจํค์ง๋ก ์ธ์ํ์ง๋ง.
ํ์ ๋ฒ์ ํธํ์ ์ํด ์์ฑ ํ๋๋ก ํ์
๐งจ main.py ์์ relative path๋ฅผ ์ด์ฉํด add_and_multiply๋ฅผ import ํ์ ๋ ๋ฐ์ํ๋ error
๐งต ํ์ด์ฌ์ด module์ ์์น๋ฅผ ์ฐพ์ ๋, __name__ ์ ๋ด๊ธด ๊ฐ์ผ๋ก ์๋๊ฒฝ๋ก๋ฅผ ์ฐพ๋๋ฐ, main์์๋ importํ๋ฉด __name__์ด __main__์ด๊ธฐ ๋๋ฌธ์ ์๋ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๊ธฐ์ค์ ์ก์ง ๋ชปํ๋ฏ๋ก error๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
๐ก main module์์ import ํ๊ธฐ ์ํด์๋ ์ ๋ ๊ฒฝ๋ก๋ฅผ ์ด์ฉํด์ผ ํ๋ค.
main์ import๋ฅผ absolute path๋ก ๋ณ๊ฒฝํ๋ ์ค๋ฅ์์ด ์ ์คํ๋๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
๐งจ module ์ธ add_and_multiply.py
์ absolute path๋ก import ํ์ ๋, ๋ฐ์ํ๋ error
mainํ์ผ์ด ์คํ๋๊ณ add_and_multiply.py๋ calculator package์ ํ์ module๋ก ๋ฑ๋ก ๋๋ค. ๋ฉ์ธ ๋ชจ๋์ ์ ๋๊ฒฝ๋ก๊ฐ ๋ฑ๋ก๋๋ฉฐ, ๋ค๋ฅธ ๋ชจ๋๋ค์ ์๋์ ์ผ๋ก ๋น๊ตํ ์ ์๋ ๋ฟ๋ฆฌ๋ก์ ์ญํ ์ ํ๋ค.
๋ฐ๋ผ์ main์์๋ absolute paht๋ฅผ, ๊ทธ์ธ์ ํ์ ๋ชจ๋์์ relative path ๋ฐฉ๋ฒ์ผ๋ก module์ import ํด์ผ ํ๋ค.