๋ชจ๋์ด๋ ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด import๋ฅผ ํด์ผํฉ๋๋ค.
import๋ฅผ ํ๊ธฐ ์ํด์ ์ฌ์ฉํ๊ณ ์ ํ๋ ํ์ผ์ด๋ ๋๋ ํ ๋ฆฌ๊ฐ ์ด๋์ ์๋์ง ํ์ด์ฌ์ด ์ฐพ์์ผ ํ๋๋ฐ
ํ์ด์ฌ์ ๋ชจ๋/ํจํค์ง๋ฅผ ์ฐพ์๋ ์๋์ ์ฅ์๋ฅผ ์์๋๋ก ๋ณด๋ฉด์ ์ฐพ์ต๋๋ค.
1.sys.modules
2. built-in modules
3. sys.path
ํ์ด์ฌ์ด ๋ชจ๋์ด๋ package๋ฅผ ์ฐพ๊ธฐ์ํด ๊ฐ์ฅ ๋จผ์ ํ์ธํ๋ ๊ณณ์ผ๋ก dictionary ํํ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฏธ import๋ ๋ชจ๋๊ณผ package๋ค์ ์ ์ฅํ๊ณ ์์ต๋๋ค.
์ฆ, ํ๋ฒ import๋ ๋ชจ๋๊ณผ package๋ค์ ํ์ด์ฌ์ด ๋ ๋ค์ ์ฐพ์ง ์๊ณ sys.modules๋ฅผ ํ์ธํ์ฌ ๊ฐ์ ธ์ต๋๋ค.
ํ ๋ฒ ์ด์ ์ฌ์ฉ๋์๊ฑฐ๋ ์ด๋ฏธ ๋ด์ฅ ๋์ด ์๋ module์ด๋ ํจํค์ง๋ง ์กด์ฌํ๋ฏ๋ก ์๋กญ๊ฒ import๋๋ ๊ฒ๋ค์ sys.modules ์์ ์ฐพ์ ์ ์์ต๋๋ค.
import sys
print(sys.modules)
'''
{'sys': <module 'sys' (built-in)>, 'builtins': <module 'builtins' (built-in)>,...}
'''
ํ์ด์ฌ์์ ์ ๊ณตํ๋ ํ์ด์ฌ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค ์
๋๋ค.
Built-in ๋ชจ๋๋ค์ ์ด๋ฏธ ํ์ด์ฌ์ ํฌํจ๋์ด ๋์ค๋ฏ๋ก ํ์ด์ฌ์ด ์ฝ๊ฒ ์ฐพ์ ์ ์์ต๋๋ค
๋ง์ง๋ง์ผ๋ก ๋ณด๋ ์ฅ์๊ฐ ๋ฐ๋ก sys.path ์
๋๋ค.
sys.path๋ ๊ธฐ๋ณธ์ ์ผ๋ก list์ด๋ฉฐ string ์์๋ค์ ๊ฐ์ง๊ณ ์๋ list ์
๋๋ค.
๊ฐ string ์์๋ค์ ๋ค์ ์ฒ๋ผ ๊ฒฝ๋ก๋ฅผ ๋ํ๋
๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก ํ์ด์ฌ์ list์ ๊ฐ ๊ฒฝ๋ก๋ฅผ ํ๋ ํ๋ ํ์ธํ๋ฉด์ ํด๋น ๊ฒฝ๋ก์ import ํ๊ณ ์ ํ๋ package๊ฐ ์์นํด ์๋์ง ํ์ธํฉ๋๋ค.
์ฐธ๊ณ ๋ก sys ๋ ํ์ด์ฌ์ ํฌํจ๋์ด ์๋ ๋ชจ๋์ ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋ค์ ์ฒ๋ผ sys ๋ชจ๋์ import ํด์ sys.modules์ sys.path ๋ฅผ ์ถ๋ ฅํ ์๋ ์๊ณ ์์ ํ ์ ๋ ์์ต๋๋ค.
import sys
print(sys.path)
print(sys.modules)
์ ๋ฆฌ๋ฅผ ํ์๋ฉด, ํ์ด์ฌ์ import ํ๊ณ ์ ํ๋ ๋ชจ๋๊ณผ package๋ฅผ ์ฐพ์๋์ ๋จผ์ sys.modules๋ฅผ ๋ณด๊ณ , ์์ผ๋ฉด ํ์ด์ฌ built-in ๋ชจ๋๋ค์ ํ์ธ ํ๊ณ ๋ง์ง๋ง์ผ๋ก sys.path์ ์ง์ ๋์ด ์๋ ๊ฒฝ๋ก๋ค์ ํ์ธํด์ ์ฐพ์ต๋๋ค.
sys.path ์์๋ ๋ชป์ฐพ์ผ๋ฉด ModuleNotFoundError ์๋ฌ๋ฅผ ๋ฆฌํดํฉ๋๋ค.
ํ์ด์ฌ์ built-in ๋ชจ๋๊ณผ pip ์ ํตํด ์ค์นํ ์ธ๋ถ ๋ชจ๋ ๋ฐ package๋ ์ผ๋ฐ์ ์ผ๋ก import ํ๋๋ฐ ํฐ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. Built-in ๋ชจ๋์ ์ค์นํ๋ฉด์ ๋ด์ฅ๋์ด ์๊ณ , pip์ผ๋ก ์ค์นํ ์ธ๋ถ ๋ชจ๋์ ์๋์ผ๋ก site-packages ๋ผ๋ ๋๋ ํ ๋ฆฌ์ ์ค์น๊ฐ ๋๋๋ฐ, ์ด site-packages ๋ sys.path์ ์ด๋ฏธ ํฌํจ๋์ด ์๊ธฐ๋๋ฌธ์ ์ฐพ๋๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋ฌธ์ ๋ ์ง์ ๊ฐ๋ฐํ local package ์ ๋๋ค. ์ง์ ๊ฐ๋ฐํ local package๋ฅผ import ํ ๋๋ ํด๋น package์ ์์น์ ๋ง๊ฒ import ๊ฒฝ๋ก๋ฅผ ์ ์ ์ธํด์ผ ํฉ๋๋ค. Local package๋ฅผ import ํ๋ ๊ฒฝ๋ก์๋ absolute path ์ relative path ๊ฐ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๊ฒฝ๋ก์ ํ๋ก์ ํธ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค.
โโโ my_app
โโโ main.py
โโโ package1
โ โโโ module1.py
โ โโโ module2.py
โโโ package2
โโโ __init__.py
โโโ module3.py
โโโ module4.py
โโโ subpackage1
โโโ module5.py
Absolute path๋ ๋ง ๊ทธ๋๋ก ์ ๋ ๊ฒฝ๋ก ์ ๋๋ค. import๋ฅผ ํ๋ ํ์ผ์ด๋ ๊ฒฝ๋ก์ ์๊ด์์ด ํญ์ ๊ฒฝ๋ก๊ฐ ๋์ผํฉ๋๋ค.๊ทธ ๋ง์ ์๋ต์ด๋ ์ถ์ฝ๋์ง ์๊ณ ๋ช ํํ ๋ช ์๋ ๊ฒฝ๋ก๋ฅผ ๋ปํฉ๋๋ค. ์ด๋์์ ์ฐ๋ ํญ์ ๊ฐ์์ ์ฌ์ฉํ๋๋ฐ ํท๊ฐ๋ฆฌ์ง ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
Absolute path๋ฅผ ์ฌ์ฉํด ์ ํ๋ก์ ํธ์ package1 ๊ณผ package2๋ฅผ import ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
from package1 import module1
from package1.module2 import function1
from package2 import class1
from package2.subpackage1.module5 import function2
๊ฒฝ๋ก๋ค์ ์์์ ์ด ์ ๋ถ "my_app" ํ๋ก์ ํธ์ ๊ฐ์ฅ ์ต์์ ๋๋ ํ ๋ฆฌ์์ ์์ํฉ๋๋ค.์๋ฅผ ๋ค์ด, subpackage1์ module5 ๋ชจ๋์ function2 ํจ์๋ฅผ import ํ๊ธฐ ์ํด์๋ ๋ค์ ๊ฒฝ๋ก๋ฅผ ๊ฑฐ์น๊ฒ ๋ฉ๋๋ค.
my_app => package2 => subpackage1 => module5.py
my_app ํ๋ก์ ํธ ๋ด์์๋ ์ด๋ ํ์ผ, ์ด๋ ์์น์์ import ํ๋์ง ๊ฒฝ๋ก๊ฐ ํญ์ ์์ ๋์ผํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก local package๋ฅผ import ํ ๋๋ absolute path๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
๋ค๋ง absolute path๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ํ๊ฐ์ง ๋จ์ ์ด ์๋๋ฐ ๋ฐ๋ก ๊ฒฝ๋ก๊ฐ ๊ธธ์ด์ง ์ ์๋ค๋ ์ ์
๋๋ค.
๊ทธ๋์ ์ด๋ฌํ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด์ relative path๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Relative path ๋ absolute path์ ๋ค๋ฅด๊ฒ ํ๋ก์ ํธ์ ์ต์๋จ ๋๋ ํ ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒฝ๋ก๋ฅผ ์ก๋๊ฒ ์๋๋ผ import ํ๋ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒฝ๋ก๋ฅผ ์ ์ํฉ๋๋ค. ๊ทธ๋์ ์ผ๋ฐ์ ์ผ๋ก relative path๋ local package ์์์ ๋ค๋ฅธ local package๋ฅผ import ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, package2์ module3์์ package2์ ํ์ package์ธ subpackage1์ module5์ function2 ํจ์๋ฅผ importํ๋ ค๊ณ ํ๋ฉด ๋ค์ ์ฒ๋ผ ํ ์ ์์ต๋๋ค.
# package2/module3.py
from .subpackage1.module5 import function2
์ฌ๊ธฐ์ dot(.)์ import๊ฐ ์ ์ธ๋๋ ํ์ผ์ ํ์ฌ ์์น๋ฅผ ๋งํฉ๋๋ค. ํ์ฌ์์น๋ package2/module3.py ์ด๋ฏ๋ก ํ์ฌ ์์น์์๋ถํฐ ์ํ๋ ๋ชจ๋์ ๊ฒฝ๋ก๋ง ์ ์ธํด์ฃผ๋ ๊ฒ์ ๋๋ค.
๋ํ dot 2๊ฐ๋ฅผ ์ฌ์ฉํ ์๋ ์๋๋ฐ, dot 2๊ฐ(..) ๋ ํ์ฌ์์น์์ ์์ ๋๋ ํ ๋ฆฌ๋ก ๊ฐ๋ ๊ฒฝ๋ก๋ฅผ ๋งํฉ๋๋ค.
Relative path๋ ์ ์ธํด์ผ ํ๋ ๊ฒฝ๋ก์ ๊ธธ์ด๋ฅผ ์ค์ฌ์ค๋ค๋ ์ฅ์ ์ ์์ง๋ง ํท๊ฐ๋ฆฌ๊ธฐ ์ฝ๊ณ ํ์ผ ์์น๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๊ฒฝ๋ก ์์น๋ ๋ณ๊ฒฝ๋์ด์ผ ํ๋ ๋จ์ ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ฌ๋งํ ๊ฒฝ์ฐ absolute path๋ฅผ ์ฌ์ฉํ๋๊ฑธ ๊ถ์ฅํฉ๋๋ค.
sys.modules
- ํ์ด์ฌ์ด ์ ์ผ๋จผ์ ๋ชจ๋์ด๋ ํจํค์ง๋ฅผ ์ฐพ๋๊ณณ
- ๋์ ๋๋ฆฌ๊ตฌ์กฐ
- import ๋์๋ ๋ชจ๋๊ณผ ํจํค์ง ์ ์ฅ (๋ค์ ์ฐพ์ง ์์๋ ๋จ)
sys.path
- ๋ชจ๋๊ณผ ํจํค์ง๋ฅผ 1,2๋ฅผ ์ฐพ๊ณ ๋ง์ง๋ง์ผ๋ก sys.path๋ฅผ ์ฐพ์
- ๋ฆฌ์คํธ๊ตฌ์กฐ(string ์์๋ฅผ ๊ฐ์ง ๋ฆฌ์คํธ)
'sys': <module 'sys' (built-in)>
sys๋ชจ๋์ ์ด๋ฏธ built-in ๋์ด ์๊ธฐ ๋๋ฌธ์ built-in module๋ค์ด ์๋ ๋ถ๋ถ์์ ์ฐพ์์ ์์ต๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์์์ ์ค๋ช ํ๋ฏ์ด sys ๋ชจ๋์ import ํด์ sys.modules์ sys.path ๋ฅผ ์ถ๋ ฅ, ์์ ์ด ๊ฐ๋ฅํ ๊ฒ์ ๋๋ค.
Absolute path
- ์ ๋๊ฒฝ๋ก
- ๊ฒฝ๋ก์ ์์์ ์ด ๊ฐ์ฅ ์ต์์ ๋๋ ํ ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก
- ๊ทธ๋์ importํ๋ ๊ฒฝ๋ก์ ์๊ด์์ด ๋ ๋์ผ
- ๊ฒฝ๋ก๊ฐ ๊ธธ์ด์ง๋ ๋จ์ ์ด ์์
Relative path
- ์๋๊ฒฝ๋ก
- ๊ฒฝ๋ก์ ์์์ ์ด import ํ๋ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก
- ๊ทธ๋์ ๊ฒฝ๋ก๊ฐ ๋์ผํ์ง ์์
- ๊ฒฝ๋ก๋ ์งง์์ง์ง๋ง ํท๊ฐ๋ฆด ์ํ๋๊ฐ ๋์