Monday_June_29
.
.
.
๐ ํ์ด์ฌ์ ํด๋น ๋ชจ๋์ด๋ ํจํค์ง๋ฅผ ์ฐพ์ ๋, 3๊ณณ์ ์ฅ์๋ฅผ ๋ค์ ธ๋ณด๋ฉฐ ๋ชจ๋๊ณผ ํจํค์ง๋ฅผ ์ฐพ๋๋ค.
๊ทธ 3๊ณณ์ ์ฅ์๊ฐ sys.modules์ built-in modules, ๊ทธ๋ฆฌ๊ณ sys.path์ธ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ํ์ด์ฌ์ ์ด 3๊ณณ์ ๋์ดํ ์์ผ๋ก ๋์๋ค๋๋ฉฐ ์ฐพ๋ ๊ฒ์ด๋ค.
ํ์ด์ฌ์ด ํด๋น ๋ชจ๋์ด๋ ํจํค์ง๋ฅผ ์ฐพ์ ๋, sys.modules ๋ผ๋ ์ฅ์๋ฅผ ๋จผ์ ์ฐพ์๋ณธ๋ค.
(๊ทธ ๋ค์์ผ๋ก ์ฐพ์๋ณด๋ ์ฅ์๋ built-in modules๋ผ๋ ๊ณณ์ด๋ค.)sys.modules๋ ๋จ์ํ dictionary ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฏธ
import๋ ๋ชจ๋/ํจํค์ง๋ค์ ์ ์ฅํ๊ณ ์๋ค.๋ค์ ๋งํด, ์ด๋ฏธ import๋ ๋ชจ๋๊ณผ package๋ค์ ํ์ด์ฌ์ด ๋ ๋ค์ ์ฐพ์ง ์์๋ ๋๋๋ก ํ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค.
(์์ง importํ์ง ์์ ๋ชจ๋/ํจํค์ง๋ sys.modules์์ ์ฐพ์ ์ ์๋ค.)
1 - ํ์ด์ฌ์ด ์ ๊ณตํ๋ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด๋ค.
2 - built-in modules์ ์ด๋ฏธ ํ์ด์ฌ์์ ํฌํจ๋์ด ๋์จ๋ค.
3 - So, ํ์ด์ฌ์ด ์ฝ๊ฒ ์ฐพ์ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก ์ด sys.path ๋ผ๋ ๊ณณ์ ์ฐพ๋๋ค.
sys.modules๋ ๋์ ๋๋ฆฌ์์ง๋ง, sys.path๋ ๊ธฐ๋ณธ์ ์ผ๋ก list์ด๋ค.
['', '/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']
์ด๋ ๊ฒ ๊ฐ ์์๋ string์ด๋ฉฐ ๊ฒฝ๋ก๋ฅผ ๋ํ๋ด์ค๋ค.
ํ์ด์ฌ์ list์ ๊ฐ ๊ฒฝ๋ก๋ฅผ ํ๋ ํ๋ ์ฒดํฌํ๋ฉด์ ํด๋น ๊ฒฝ๋ก์ importํ๊ณ ์ ํ๋ ๋ชจ๋/ํจํค์ง๋ค์ด ์๋์ง ํ์ธํ๋ค.
(๋ง์ฝ ๋ง์ง๋ง ์ฒดํฌ ์ฅ์์ธ sys.path๊น์ง importํ๊ณ ์ ํ๋ ๋ชจ๋/ํจํค์ง๊ฐ ์๋ค๋ฉด, ModuleNotFoundError ์๋ฌ๊ฐ ๋ฌ๋ค.)
sys๋ ํ์ด์ฌ์ ํฌํจ๋์ด์๋ ๋ชจ๋์ด๋ค.(๋ฌด์จ ๋ป์ด๋?)
ํ์ด์ฌ์์ ๊ณต์์ ์ผ๋ก ์ ๊ณตํ๊ณ ์ด๋ฏธ ํ์ด์ฌ์์ ํฌํจ๋๋ค๋ ๋ง
์ฆ, built-in modules์ ์๊ธฐ์, sys.modules๋ฅผ ๋จผ์ ์ฐพ๊ณ ์์ผ๋
2๋ฒ์งธ ์ฒดํฌ ์ฅ์์ธ built-in modules๋ฅผ ์ฒดํฌํ๋ค๊ฐ ๋ฐ๊ฒฌํ๊ณ import๋ฅผ ํ๋ ๊ฒ์ด๋ค.
import๋ฅผ ํ๋ ํ์ผ/ํจํค์ง๊ฐ ๊ฒฝ๋ก์ ์๊ด์์ด ํญ์ ๊ฒฝ๋ก๊ฐ ๊ฐ๋ค.
์๋ฅผ ๋ค์ด, ์์ฝ๋์ ์๋ด์ ์ ์ฒญํ๋ ค๊ณ ์์ํฌ๋ก ๊ฐ๋ ค๊ณ ํ๋ค.
๊ทธ ๋๊ฐ ์ด๋์ ์ด๋ ์ง ์์ํฌ๋ก ์ค๋ ค๋ฉด ์์ธ์ ๊ฐ๋จ๊ตฌ ํ ํค๋๋ก 427 ์์ํฌ ํ์(์์ํฌ ์ ๋ฆ 2ํธ์ ) ์ผ๋ก ์์ผํ๋ค.
์๋ ๊ฒฝ๋ก๋ ์ ๋ ๊ฒฝ๋ก์ ๋ค๋ฅด๊ฒ importํ๋ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒฝ๋ก๋ฅผ ์ ์ํ๋ค. (๋ด ์์น๊ฐ ์ค์ํ๋ค๋ ๋ป)
์๋ฅผ ๋ค์ด, ์์ง์ ์ฌ๋ ์ฌ๋์ ์์ํฌ์ ์ฌ ๋ ์ง์ ๋์ ์ ๊ฑด๋ฌผ์ธ ์์ํฌ๋ก ์ค๋ฉด ๋๋ค.
์์ง์ ์ฌ๋ ์ฌ๋์ ๊ธธ๋ง ๊ฑด๋๋ฉด ๋๋ค. ๋ฉ๋ฆฌ ์ฌ๋ ์ฌ๋์ ์ฐจ๋ฅผ ํ๊ณ ์์ผํ๊ณ , ํด์ธ์ ์ฌ๋ ์ฌ๋์ ๋นํ๊ธฐ๋ฅผ ํ๊ณ ์์ ์ฐจ๋ฅผ ํ๊ณ ์์ผํ๋ค.๋น์ ๊ฐ ์ด์ํ์ ์๋ ์๋๋ฐ, ์ ๋ ๊ฒฝ๋ก์ ์๋ ๊ฒฝ๋ก์ ์ฐจ์ด๋ ๊ธฐ์ค์ด ๋ค๋ฅธ ๊ฒ์ด๋ค.
my_app โโโ main.py โโโ pkg1 โ โโโ __init__.py โ โโโ module1.py โ โโโ module2.py โโโ pkg2 โ โโโ __init__.py โ โโโ module3.py โ โโโ module4.py โ โโโ module5.py โ โโโ pkg4 โ โโโ __init__.py โ โโโ module6.py โโโ pkg3 โโโ __init__.py โโโ module7.py
๋๋ ํ ๋ฆฌ๊ฐ ์ด๋ฌํ ๊ตฌ์กฐ๋ก ๋์ด์๋ค๊ณ ๊ฐ์ ์ ํ๊ณ , ๋ง์ฝ ๋ด๊ฐ my_app์์ ์๋ pkg2์ pkg4์ module6.py ํ์ผ์ ์๋ ์ด๋ ํ ์์๋ฅผ importํ๊ณ ์ถ๋ค๋ฉด ๋ด๊ฐ ์ด๋ ์์น์ ์๋์ง ์ ๋ ๊ฒฝ๋ก๋ ๋ค์๊ณผ ๊ฐ๋ค.
๐ Absolute path(์ ๋ ๊ฒฝ๋ก)
from pkg2.pkg4.module6 import any_var from pkg2.pkg4.module6 import any_func() from pkg2.pkg4.module6 import AnyClass
์ด๋ ๊ฒ ํด๋ ๋๊ณ , ๋ง์ฝ importํ ๋ฌด์ธ๊ฐ๊ฐ ํ์คํ์ง ์๋ค๋ฉด from์ผ๋ก ๋ถ๋ฌ์ค๊ณ module6 ํ์ผ๋ง importํด์ค์ ๋์ค์ ํ์ํ ์์๋ฅผ module.๋ฌด์ธ๊ฐ ๋ผ๋ ํ์์ผ๋ก ์จ์ฃผ๋ฉด ๋๋ค.
from pkg2.pkg4 import module6 my_var = module6.any_var my_func = module6.any_func() MyClass = module6.AnyClass
์ฌ๊ธฐ์ ์ค์ํ๊ฑด, ๋ด๊ฐ ์ด๋์ ์๋ ์ง, ์ต์์(my_app)๋ฅผ ๊ธฐ์ค์ผ๋ก
๊ฒฝ๋ก๋ฅผ ์ค์ ํ๋ ๊ฒ์ด๋ค.๐ Relative path(์๋ ๊ฒฝ๋ก)
์๋ ๊ฒฝ๋ก๋ ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒฝ๋ก๋ฅผ ์ก๋๋ค. ์ ๊ฒฝ๋ก๋ฅผ ์๋ก, ๋ด๊ฐ ๋ง์ฝ module6.py์ ์๋ค๊ณ ์น๊ณ module7.py๋ก ๊ฐ๊ณ ์ถ๋ค๋ฉด, ์๋ก ๋ ๋ฒ ์ฌ๋ผ๊ฐ์(pkg4 > pkg2) ๊ฐ์ ์ธต์ ์๋ pkg3๋ก ๊ฐ๊ณ ํ ๋ฒ ๋ ๋ด๋ ค๊ฐ module7.py ๋ก ๊ฐ๋ฉด ๋๋ ๊ฒ์ด๋ค.
๋ง์ฝ module4.py์ ์๋๋ฐ module6.py ํ์ผ์ importํ๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
from .pkg4 import module6
.์ ํ์ฌ ์์น๋ฅผ ๋ปํ๋ค. ๋ค์ ๋งํด ํ์ฌ ์์น์์ pkg4๋ฅผ ๋ถ๋ฌ์ค๊ณ module6๋ pkg4 ์์ ์์ผ๋ ๋ฐ๋ก import๋ฅผ ํด์ฃผ๋ฉด ๋๋ ๊ฒ์ด๋ค.