๐ ์ด ํฌ์คํ ์์๋ Python์ modules์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. module์ ๊ฐ์ข ๋ณ์, ํจ์, ํด๋์ค ๋ฑ์ ๋ด๊ณ ์๋ .py ํ์ผ์ด๋ฉฐ, ์ฌ๋ฌ ๋ชจ๋์ด ๊ทธ๋ฃนํ๋์ด์๋ ๊ฒ์ด ํจํค์ง์ ๋๋ค.
๐ฅ sys.modules ์ sys.path์ ์ฐจ์ด์
๐ฅ Absolute path์ Relative path์ ์ฐจ์ด
๐ฅ calculator ํจํค์ง
โ๏ธ ํด๋น ํ์ผ์ด๋ ๋๋ ํ ๋ฆฌ๊ฐ ์ด๋์๋์ง ๊ฒฝ๋ก๋ฅผ ์๊ณ , ๊ทธ ๊ฒฝ๋ก์์ importํจ์ผ๋ก์จ ๋ชจ๋ ๋๋ ํจํค์ง๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
โ๏ธ python์ ๋ค์ 3๊ฐ์ง ๋ฐฉ์๋ฅผ ์์๋๋ก ๋ณด๋ฉด์ ๋ชจ๋ ๋๋ ํจํค์ง๋ฅผ ํ์ํฉ๋๋ค.
1) sys.modules
2) built-in modules
3) sys.path
โ๏ธ sys.modules์ ๋์
๋๋ฆฌ ํํ๋ก ๊ตฌ์ฑ๋์ด ์๊ณ , python์ด ๋ชจ๋์ด๋ ํจํค์ง๋ฅผ ์ฐพ๊ธฐ ์ํด ๊ฐ์ฅ ์ฐ์ ํด์ ํ์ธํ๋ ์์ญ์
๋๋ค. ํนํ, sys.modules์ ํ๋ฒ import๋ ๋ชจ๋๊ณผ ํจํค์ง๋ ๋ค์ ์ฐพ์ง ์๋๋ก ์๋ํฉ๋๋ค.
โ๏ธ built-in modules์ pythob์์ ์ ๊ณตํ๋ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค. ์ด๋ฏธ python์ ๋ด์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ณ๋๋ก importํ์ง ์๊ณ ์ฌ์ฉํ ์ ์์ต๋๋ค. print(), len(), append() ์ ๊ฐ์ ํจ์๋ค์ ๋ชจ๋ built-in module์ ์ํด ์์ต๋๋ค.
โ๏ธ sys.path์ ๋ง์ง๋ง์ผ๋ก ํ์๋๋ ์์ญ์ผ๋ก list์ ๋ด๊ฒจ ๊ฒฝ๋ก๋ก ์ ์ฅ๋์ด ์์ต๋๋ค. sys.path์ site-packages์๋ pip๋ก ์ค์น๋ ์ธ๋ถ ๋ชจ๋์ด ์ ์ฅ๋์ด ์์ต๋๋ค. ์๋์ฒ๋ผ sys.path๋ฅผ ์ถ๋ ฅํ๋ฉด ์๋์ ๊ฐ์ด ๊ฒฝ๋ก๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
import sys print(sys.path) """ [ '/Users/jangjaewon/Documents/C', '/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', '/Users/jangjaewon/Documents/A/z_env/lib/python3.9/site-packages' ] """
โ๏ธ sys.path ์์๋ ๋ชป์ฐพ์ผ๋ฉด "ModuleNotFoundError" ์๋ฌ๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ "ModuleNotFoundError"๋ฅผ ๋ณด๊ฒ๋๋ฉด ๋ชจ๋ ๋๋ ํจํค์ง ์ง์ ์ ๋ฌธ์ ๊ฐ ์๋์ง ํ์ธํด์ผํฉ๋๋ค.
โ๏ธ sys.module์ ํ๋ฒ import๋ ๋ชจ๋์ด๋ ํจํค์ง๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฌ์ฉํ๊ธฐ ์ํด ์ ์ฅํด๋ ๊ณณ์ด๊ธฐ ๋๋ฌธ์ "ํด๋น ๋ชจ๋์ ์ฌ์ฉ ์ฌ๋ถ"๋ฅผ ์ฒดํฌํ๊ธฐ ์ํด์ ๋์
๋๋ฆฌ ํํ๋ก ์กด์ฌํฉ๋๋ค. ๋์
๋๋ฆฌ ํํ ์๋ฃ๊ตฌ์กฐ๋ key๋ฅผ ํตํด ํ์ํ๊ธฐ ๋๋ฌธ์ ์๋๊ฐ ๋น ๋ฅด๊ณ ์กด์ฌํ๋์ง ์๋์ง ๋ฐ๋ก ์ ์ ์์ต๋๋ค.
โ๏ธ ์ด์ ๋ฐํด sys.path๋ ๋ฆฌ์คํธ์ ๊ฒฝ๋ก๋ก์จ ๋ชจ๋๊ณผ ํจํค์ง๊ฐ ๋ด๊ฒจ์๊ณ , ์๋์ง ์๋์ง๊ฐ ์๋ ์ด๋(Where)์ ์กด์ฌํ๋์ง๋ฅผ ํ๋ํ๋ ํ์ ํ์ํด์ผํ๊ธฐ ๋๋ฌธ์ ๋์
๋๋ฆฌ ๋ณด๋ค ๋ฐฐ์ด์ด ํจ์จ์ ์
๋๋ค. ์ด์ built-in module์ ์ ์ธํ ๋ชจ๋ ๋ชจ๋์ ์ฒซ import์์ sys.path๋ฅผ ์ผ์ผํ ํ์ธํด์ผํฉ๋๋ค.
โ๏ธ Absolute path๋ ์ ๋๊ฒฝ๋ก๋ก ์ต์๋จ ๋๋ ํ ๋ฆฌ(Base Directory) ์ดํ์ ๊ฒฝ๋ก๋ฅผ ์์ฐจ์ ์ผ๋ก ๋ช
์ํจ์ผ๋ก์จ ๋ชจ๋ ๋๋ ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์
๋๋ค.
โ๏ธ Absolute path์ ๋จ์ ์ ์ต์๋จ ๋๋ ํ ๋ฆฌ(Base Directory)๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒฝ๋ก๋ฅผ ์ก๊ธฐ ๋๋ฌธ์ ๊ฒฝ๋ก๊ฐ ๋งค์ฐ ๊ธธ์ด์ง ์ ์์ต๋๋ค.
โ๏ธ Relative path๋ ๊ฒฝ๋ก๋ฅผ ์ง์ ํจ์ ์์ด ๊ธฐ์ค์ ์ ์ต์๋จ ๋๋ ํ ๋ฆฌ(Base Directory)๊ฐ ์๋ ๋ชจ๋์ ์ฌ์ฉํ๋ ์์น๋ก ๋ถํฐ ์ค์ ํ๊ธฐ ๋๋ฌธ์ Absolute path์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด ์ฌ์ฉํฉ๋๋ค.
โ๏ธ Relative path ๋ฐฉ์ ๋ํ ๋จ์ ์ด ์กด์ฌํ๋๋ฐ ์๋์ ์ธ ๊ฒฝ๋ก์ด๊ธฐ ๋๋ฌธ์ ๋ชจ๋์ด๋ ํจํค์ง์ ์์น๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๊ฒฝ๋ก ๋ํ ๋ณ๊ฒฝํด์ค์ผํ๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
+-- calculator | +-- __init__.py | +-- add_and_multiply.py | +-- multiplication.py +-- main.py
โ๏ธ ์ ๋๊ฒฝ๋ก๋ก ์คํ์ํค๋ฉด ๋ฌธ์ ์์ด ์ฒ๋ฆฌ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
from calculator.add_and_multiply import add_and_multiply if __name__ == '__main__': print(add_and_multiply(2,5)) # 17 """
โ๏ธ ์๋๊ฒฝ๋ก๋ ์๋์ ๊ฐ์ "ImportError" ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
โ๏ธ __main__
์ ์ด๋ฆ์ผ๋ก ๊ฐ๋ main module์์ ๋ชจ๋์ import ํ๋ ๊ฒฝ์ฐ์๋ ์ ๋๊ฒฝ๋ก๋ฅผ ์ด์ฉํด์ผ ํฉ๋๋ค.
from .calculator.add_and_multiply import add_and_multiply if __name__ == '__main__': print(add_and_multiply(2,5)) """ Traceback (most recent call last): File "main.py", line 5, in <module> from .calculator.add_and_multiply import add_and_multiply ImportError: attempted relative import with no known parent package """
โ๏ธ main module์ ์ง์ ํ์ง ์์์ ๋๋ ์ ๋๊ฒฝ๋ก์ ์๋๊ฒฝ๋ก ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
# absolule path from calculator.multiplication import multiply def add_and_multiply(a,b): return multiply(a,b) + (a+b) print(multiply(3,9)) # 27
# relative path from .multiplication import multiply def add_and_multiply(a,b): return multiply(a,b) + (a+b) print(multiply(3,9)) # 27
โ๏ธ ์ฆ, main module(__main__
)์ด ์ง์ ๋ ์ํ์์๋ ์ ๋๊ฒฝ๋ก๋ก importํด์ผํ๊ณ , main module์ด ์ง์ ๋ ์ํ๊ฐ ์๋๊ฒฝ์ฐ๋ ์ ๋๊ฒฝ๋ก๋ ์๋๊ฒฝ๋ก๋ importํ๋๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
โ๏ธ ํด๋น ๋๋ ํ ๋ฆฌ๊ฐ ํจํค์ง์ ์ผ๋ถ์์ ์๋ ค์ฃผ๋ ์ญํ ์ ํฉ๋๋ค
โ๏ธ 3.3๋ถํฐ๋ init์ด ์์ด๋ ์ธ์ํ๋ค๊ณ ํ์ง๋ง, ์ด์ ๋ฒ์ ์์ init.py ํ์ผ์ด ์๋ค๋ฉด ํจํค์ง๋ก ์ธ์๋์ง ์์ ์๋ ์์ต๋๋ค.