ํ์ด์ฌ ๋ชจ๋๊ณผ ํจํค์ง์ ๋ํด ์์๋ณด์
์ฐ์ sys.modules์ ๋ํด์ ์์๋ณด์
sys.modules์ ํ์ด์ฌ์ด ๋ชจ๋์ด๋ package๋ฅผ ์ฐพ๊ธฐ์ํด ๊ฐ์ฅ ๋จผ์ ํ์ธํ๋ ๊ณณ์ด๋ค.
sys.modules๋ ๋จ์ํ dictionary๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฏธ import๋ ๋ชจ๋๊ณผ package๋ค์ ์ ์ฅํ๊ณ ์๋ค.
์ฆ, ํ๋ฒ import๋ ๋ชจ๋๊ณผ package๋ค์ ํ์ด์ฌ์ด ๋ ๋ค์ ์ฐพ์ง ์์๋ ๋๋๋ก ํ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์๋ก import ํ๋ ๋ชจ๋์ sys.modules ์์ ์ฐพ์ ์ ์๋ค.
sys.modules๋ฅผ ์ฐ์ด๋ณด์
import sys
import math
print(sys.modules)
๋ญ๊ฐ ๋ง์๋ณด์ด์ง๋ง ์์ธํ ๋ณด๋ฉด ๋์ ๋๋ฆฌ ๊ตฌ์กฐ์ด๋ฉฐ ๋งจ ๋ง์ง๋ง์ค์ ๋ณด๋ฉด ๋ด๊ฐ importํ math๋ชจ๋์ด ์๋๊ฒ ๋ณด์ธ๋ค.
์ฒซ์งธ์ค์ ๋ณด๋ฉด built-inํญ๋ชฉ๋ค๋ ๋ณด์ธ๋ค.
sys.modules์ math๋ชจ๋์ด ๋ด๊ฒจ์ ธ ์๊ธฐ ๋๋ฌธ์ ๋ด๊ฐ math๋ชจ๋์ ์ฌ์ฉํ ๋ ํ์ด์ฌ์ ํํ ์ด๋ ์ math๋ชจ๋์ ์ฐ๋๊ตฐ ํ๋ฉด์ sys.modeles๋ฅผ ์ฐธ์กฐํ๋ค. ๊ทธ๋์ ๋ ๋ค์ ์ฐพ์ง ์๋๋ค.
sys.path๋ ๊ธฐ๋ณธ์ ์ผ๋ก list์ด๋ฉฐ string ์์๋ค์ ๊ฐ์ง๊ณ ์๋ list๋ค.
๊ฐ string ์์๋ค์ ๋ค์ ์ฒ๋ผ ๊ฒฝ๋ก๋ฅผ ๋ํ๋ธ๋ค
sys.path๋ ์ฐ์ด๋ณด์
print(sys,path)
[
'/Users/sdk/Desktop/codingtest/ํ์ด์ฌ์๊ณ ๋ฆฌ์ฆ์ธํฐ๋ทฐ/08์ฅ์ฐ๊ฒฐ๋ฆฌ์คํธ',
'/Library/Frameworks/Python.framework/Versions/3.9/lib/python39.zip',
'/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9',
'/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/lib-dynload',
'/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages'
]
sys ๋ชจ๋์ ํ์ด์ฌ์ ๋ด์ฅ๋ ๋ชจ๋์ด๊ธฐ ๋๋ฌธ์ ํ์ด์ฌ์ ์ด ๋ชจ๋์ ์ด๋์์ ์ฐพ์์ผ ํ ์ง ์๊ณ ์๋ค.
์๊น (sys.modules)๋ฅผ ํ๋ฆฐํธ ์ฐ์ด๋ณด๋ฉด sys๊ฐ built-in์ธ๊ฒ์ ์ ์ ์๋ค.
Absolute path๋ ์ด๋ฆ ๊ทธ๋๋ก ์ ๋ ๊ฒฝ๋ก๋ค. ์ ์ ๋ ๊ฒฝ๋ก์ธ๊ฐ ํ๋ฉด, import๋ฅผ ํ๋ ํ์ผ์ด๋ ๊ฒฝ๋ก์ ์๊ด์์ด ํญ์ ๊ฒฝ๋ก๊ฐ ๋์ผํ๊ธฐ ๋๋ฌธ์ด๋ค.
โโโ my_app
โโโ main.py
โโโ package1
โ โโโ module1.py -> func2()๊ฐ ๋ค์ด์์
โ โโโ module2.py
โโโ package2
โโโ __init__.py
โโโ module3.py -> func3()๊ฐ ๋ค์ด์์
โโโ module4.py
โโโ subpackage1
โโโ module5.py
์์ ๊ฐ์ด ํจํค์ง๊ฐ ๊ตฌ์ฑ๋์ด์์ ๋ module3.py์ func3()๋ฅผ importํด๋ณด์
from package2.module3 import func3
์ด๋ฒ์ module1.py
์ func2๋ฅผ importํด๋ณด์
from package1.mudule1 import func2
๋ ๋ค ๋ณด๋ฉด ๋ฃจํธ ๋๋ ํ ๋ฆฌ(my_app
)์์ ์์ํด์ ์ฐพ๋ ๊ฑธ ์ ์ ์๋ค.
my_app => package2 => module1.py => func2
from package1.module2 import func2
my_app ํ๋ก์ ํธ ๋ด์์๋ ์ด๋ ํ์ผ, ์ด๋ ์์น์์ import ํ๋์ง ๊ฒฝ๋ก๊ฐ ํญ์ ์์ ๊ฐ์ด ๋์ผํ๊ฒ ๋๋ฏ๋ก absolute path ๋ผ๊ณ ํ๋ ๊ฒ์ด๋ค.
Relative path ๋ absolute path์ ๋ค๋ฅด๊ฒ ํ๋ก์ ํธ์ ์ต์๋จ ๋๋ ํ ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒฝ๋ก๋ฅผ ์ก๋๊ฒ ์๋๋ผ import ํ๋ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒฝ๋ก๋ฅผ ์ ์ํ๋ค.
๊ทธ๋์ ์ผ๋ฐ์ ์ผ๋ก relative path๋ local package ์์์ ๋ค๋ฅธ local package๋ฅผ import ํ ๋ ์ฌ์ฉํ๋ค.
โโโ my_app
โโโ main.py
โโโ package1
โ โโโ module1.py -> func2()๊ฐ ๋ค์ด์์
โ โโโ module2.py
โโโ package2
โโโ __init__.py
โโโ module3.py -> func3()๊ฐ ๋ค์ด์์
โโโ module4.py
โโโ subpackage1
โโโ module5.py
์๋ฅผ ๋ค์ด ๋ด๊ฐ module1.py ์์ package2์ module3.py๋ฅผ relative path๋ก ์ํฌํธ ํด๋ณด์
from ..package2.module3 import func3()
..
์ ์์ ๋๋ ํ ๋ฆฌ๋ก ์ด๋ํ๋๊ฒ์ด๋ค.
์์๋๋ ํ ๋ฆฌ package2๋ก์ด๋ํ๊ณ package2์์๋ mudule3์ func3()๋ฅผ ์ํฌํธ ํ๋ค.
Relative path๋ ์ ์ธํด์ผ ํ๋ ๊ฒฝ๋ก์ ๊ธธ์ด๋ฅผ ์ค์ฌ์ค๋ค๋ ์ฅ์ ์ ์์ง๋ง ํท๊ฐ๋ฆฌ๊ธฐ ์ฝ๊ณ ํ์ผ ์์น๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๊ฒฝ๋ก ์์น๋ ๋ณ๊ฒฝ๋์ด์ผ ํ๋ ๋จ์ ์ด ์๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์ฌ๋งํ ๊ฒฝ์ฐ absolute path๋ฅผ ์ฌ์ฉํ๋๊ฒ ๊ถ์ฅ ๋๋ค.
__init__
, __main__
์์ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ํจํค์ง๊ฐ ์๋ค๊ณ ํ์
๊ฐ์ ์ฝ๋๋
# 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))
from .multiplication import multiply
# from calculator.multiplication import multiply
def add_and_multiply(a,b):
return multiply(a,b) + (a+b)
def multiply(a,b):
return(a*b)
์ ์ผ๋จ main.py
์์ add_and_multiply
ํจ์๋ฅผ ์๋๊ฒฝ๋ก๋ก importํด์ ์คํ์ ํด๋ณด์
์๋ ค์ง ์์ ํจํค์ง๊ฐ ์๋ ์๋ ๊ฐ์ ธ์ค๊ธฐ ์๋๋ผ๋ ์ค๋ฅ๊ฐ ๋ฌ๋ค.
์ ์ด๋ด๊น?
์๋ ๊ฐ์ ธ์ค๊ธฐ๋ ํ์ฌ ๋ชจ๋์ ์ด๋ฆ์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ๋ฉ์ธ ๋ชจ๋์ ์ด๋ฆ์ด ํญ์ "main"์ด๋ฏ๋ก ํ์ด์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฉ์ธ ๋ชจ๋๋ก ์ฌ์ฉ๋๋ ๋ชจ๋์ ํญ์ ์ ๋ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ถ์ฒ
๊ทธ๋ ๋ค! ์คํ ๋ฒํผ์ ๋๋ฅด๋ฉด __name__
์ด __main__
์ผ๋ก ๋ฐ๋๊ธฐ ๋๋ฌธ์ ํญ์ ์ ๋ ๊ฒฝ๋ก๋ฅผ ์จ์ผํ๋ค.!
add_and_multiply
ํจ์ ์ง์ ์คํ์ด๋ฒ์๋ add_and_multiply
ํจ์๋ฅผ ์๋๊ฒฝ๋ก๋ก ์คํํด๋ณด์
from .multiplication import multiply
def add_and_multiply(a,b):
return multiply(a,b) + (a+b)
์ญ์ ์ด๋ฒ์๋ ์ง์ ์คํํ๊ธฐ ๋๋ฌธ์ ์๋ ค์ง ์์ ํจํค์ง๊ฐ ์๋ ์๋ ๊ฐ์ ธ์ค๊ธฐ ์๋๋ผ๋ ์ค๋ฅ๊ฐ ๋ฌ๋ค.
๊ทธ๋ ๋ค๋ฉด ์ ๋๊ฒฝ๋ก๋ก ํ๋ฉด ๋๊ฒ ์ง ํ๊ณ ์คํํ์ง๋ง
from calculator.multiplication import multiply
def add_and_multiply(a,b):
return multiply(a,b) + (a+b)`
calculator๋ชจ๋์ด ์๋ค๊ณ ๋ฌ๋ค ์ ๊ทธ๋ด๊น???
์๋ ๊ฐ์ ธ์ค๊ธฐ๋ ๋ชจ๋์ name ์์ฑ์ ์ฌ์ฉํ์ฌ ํจํค์ง ๊ณ์ธต์์ ํด๋น ๋ชจ๋์ ์์น๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ๋ชจ๋ ์ด๋ฆ์ ํจํค์ง ์ ๋ณด๊ฐ ํฌํจ๋์ง ์์ ๊ฒฝ์ฐ(์: 'main'์ผ๋ก ์ค์ ๋จ) ์๋ ๊ฐ์ ธ์ค๊ธฐ๋ ๋ชจ๋์ด ํ์ผ ์์คํ
์์ ์ค์ ๋ก ์๋ ์์น์ ๊ด๊ณ์์ด ๋ชจ๋์ด ์ต์์ ๋ชจ๋์ธ ๊ฒ์ฒ๋ผ ํด๊ฒฐ๋ฉ๋๋ค.
์ถ์ฒ
๊ทธ๋ ๋ค ์คํ์ ํ๋ ์๊ฐ ์ด์ ๊ทธ ๋ชจ๋์ ์ต์์๋ผ๊ณ ์ธ์ํ๊ธฐ ๋๋ฌธ์ calculator๋ฅผ ์ธ์ํ์ง ๋ชปํ๋ ๊ฒ์ด๋ค.
#from .multiplication import multiply
from multiplication import multiply
def add_and_multiply(a,b):
return multiply(a,b) + (a+b)
์๋ก์ฝ๋กฌ ๋ฐ๊ฟ์ฃผ๋ฉด ์คํ์ด ๋๋ค.
__init__.py
์ ์ญํ __init__.py
ํ์ผ์ ํด๋น ๋๋ ํฐ๋ฆฌ๊ฐ ํจํค์ง์ ์ผ๋ถ์์ ์๋ ค์ฃผ๋ ์ญํ ์ ํ๋ค.
python3.3 ๋ฒ์ ๋ถํฐ๋ init.py ํ์ผ์ด ์์ด๋ ํจํค์ง๋ก ์ธ์ํ๋ค(PEP 420). ํ์ง๋ง ํ์ ๋ฒ์ ํธํ์ ์ํด init.py ํ์ผ์ ์์ฑํ๋ ๊ฒ์ด ์์ ํ ๋ฐฉ๋ฒ์ด๋ค.
์ถ์ฒ
Package ์์ init.py ํ์ผ์ด ์์ผ๋ฉด package๊ฐ import ๋ ๋ init.py ํ์ผ์ ์ฝ๋๋ค์ด ์๋์ผ๋ก ์คํ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ค์ ์ฌํญ๋ค์ ํ ์ ์๋ค.
Import ํ ๋ ๊ฒฝ๋ก์ ์ด ๊ธธ์ด ์ค์ฌ์ฃผ๊ธฐ
Package์์ import ํ ์ ์๋ ๋ณ์/ํจ์/ํด๋์ค ์ ํํ๊ธฐ
๊ทธ ์ธ package๊ฐ import๋ ๋ ๊ผญ ๋จผ์ ์คํ๋์ด์ผ ํ๋ ์ฝ๋๋ค