Module
- ํ์ด์ฌ์์ ๋ชจ๋์ ๋ณ์๋ ํจ์ ๊ทธ๋ฆฌ๊ณ ํด๋์ค ๋ฑ์ ๋ชจ์๋์ ํ์ผ์ด๋ค.
- ๋ฐ๋ก ๋ชจ๋๋ก ๋ชจ์๋์ ์ด์
- ๋ค๋ฅธ ํ์ผ์์ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๊ฒ ํ๋ค.
- ์ ์ฒด ์ฝ๋๊ฐ ํ ํ์ผ์ ๋ฃ๊ธฐ์๋ ๋๋ฌด ์ปค์ก์๋ ์ฌ๋ฌ ํ์ผ๋ก ๋๋์ด์ ์ ๋ฆฌ๋ฅผ ํ๊ธฐ ์ํด์
- ๋ชจ๋์ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ด๋ฏธ ๋ง๋ค์ด๋์ ๋ชจ๋์ ์ฌ์ฉํ ์๋ ์๊ณ ์ฐ๋ฆฌ๊ฐ ์ง์ ๋ง๋ค์ด์ ์ฌ์ฉํ ์๋ ์๋ค.
Module ๋ง๋ค๊ธฐ
my_module_var = 7
def my_module_func():
return "Hello!"
class MyModuleClass:
pass
import my_module
- ์ํ๋ ๋ชจ๋์ import ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ๋ฌ์จ๋ค. ๊ทธ๋ผ์ผ๋ก ํ์ด์ฌ์ด ๋ชจ๋์ ํด๋น ํ์ผ๊ณผ ์ฐ๊ฒฐ์ํค๊ฒ ๋๋ค.
- ๊ทธ ํ ์ฐ๊ฒฐ๋ ๋ชจ๋์์ ์ํ๋ ๋ณ์/ํจ์/ํด๋์ค ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. ๋ค๋ง ํด๋น ๋ชจ๋ ์ด๋ฆ๊ณผ ์ฐ๊ฒฐํด์ ํธ์ถ์ ํด์ค์ผ ํ์ด์ฌ์ด ์ด๋ ํ์ผ์์ ํด๋น ๋ณ์/ํจ์/ํด๋์ค ๋ฅผ ์ฐพ์ ์ ์๋์ง ์ ์ ์๊ฒ๋๋ค.
Alternative ways to import modules
import
ํค์๋ ์ธ์ from ... import ...
ํค์๋๋ฅผ ์ฌ์ฉํด์ ๋ชจ๋์ ๋ถ๋ฌ๋ค์ผ์ ์๋ค.
from <๋ชจ๋ ์ด๋ฆ> import <ํจ์/๋ณ์/ํด๋์ค1>, <ํจ์/๋ณ์/ํด๋์ค2>, ..., <ํจ์/๋ณ์/ํด๋์คN>
from my_module import my_module_func, my_module_var
print(my_module_var)
my_module_func()
my_module
๋ชจ๋์์ my_module_func
ํจ์์ my_module_var
๋ณ์๋ฅผ import
ํ๋ค.
from ... import ...
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋์ ๋ถ๋ฌ๋ค์ด๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ด๋ฆ์ ๋ถ์ด์ง ์๊ณ ๊ณง๋ฐ๋ก ์ํ๋ ํจ์๋ ๋ณ์ ๊ทธ๋ฆฌ๊ณ ํด๋์ค๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
- ๋ชจ๋์์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ช
ํํ ๋
from ... import ...
๋ฅผ ์ฌ์ฉํ๋ฉด ํธ๋ฆฌํฉ๋๋ค.
from my_module import *
print(my_module_var)
my_module_func()
- ๋ณํ
*
๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋น ๋ชจ๋์ ๋ชจ๋ ์์๊ฐ ๊ณง๋ฐ๋ก import
๋๋ค.
- ํ์ง๋ง ์ด๋ ๊ฒ ํ๋ ๊ฒ์ ๊ถ์ฅ๋์ง ์๋๋ค.
- ์๋ํ๋ฉด local scope๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋ค๋ฅธ ๋ณ์/ํจ์/ํด๋์ค ๋ค๊ณผ ์ด๋ฆ ์ถฉ๋์ด ๋ ์ ์๋๋ฐ, ๋ง์ผ ์ด๋ฆ ์ถฉ๋์ด ์ผ์ด๋ฌ์ ๊ฒฝ์ฐ ์๊ธฐ๊ฐ ์ฝ์ง ์์์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
Import As
from my_module import my_func as f1
from my_module2 import my_func as f2
from my_module3 import function_with_name_too_long as f3
f1()
f2()
f3()
- ๋ง์ผ ์ฌ๋ฌ ๋ชจ๋์ import ํ๊ฒ ๋๋ฉด ์ด๋ฆ ์ถฉ๋์ด ๋ ์๋ ์๋ค.
- ์๋ฅผ ๋ค์ด ์๋ก ๋ค๋ฅธ ๋ชจ๋์์ ๋์ผํ ์ด๋ฆ์ ํจ์๊ฐ ์์ ์๋ ์๋ค.
- ์ํ๋ ๋ชจ๋์ ์์์ ์ด๋ฆ์ด ๋๋ฌด ๊ธธ์๋ ์๋ค.
- ์ด๋ฌํ ๊ฒฝ์ฐ import as ํค์๋๋ฅผ ์ฌ์ฉํด์ ์๋ก์ด ์ด๋ฆ์ ์ฃผ์ด์ ์ฌ์ฉํ ์ ์๋ค.
import my_module as m1
m1.my_module_func()
module
์ด๋ฆ๋ as
๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก์ด ์ด๋ฆ์ ์ค ์ ์๋ค.
Packages
- Package๋ module๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ค๋ฅธ ํ์ผ์์ ๋ถ๋ฌ์์ ์ฌ์ฉํ๋ ๊ฐ๋
์ด๋ค.
- ์ฐจ์ด์ ์ module๋ณด๋ค ๋ ํฌ๊ณ ๋ณต์กํ ์ฝ๋๋ผ๋ ์ ์ด๋ค.
- module์ ๋จ์ํ ํ์ด์ฌ ํ์ผ์ด๋ค.
- ์ด๋ ํ module๋ค์ ์ฝ๋์ ์์ด ๋๋ฌด ์ปค์ ํ ํ์ผ์ ๋ค ๋ฃ๊ธฐ์ ๋นํจ์จ์ ์ผ์ ์๋ค.
- ๊ทธ๋ฌํ ๊ฒฝ์ฐ ์ฌ๋ฌ ํ์ผ์ ๋๋์ด์ ์ฝ๋๋ฅผ ๊ด๋ฆฌํ๋๊ฒ์ด ํจ๊ณผ์ ์ผ ๊ฒ์ด๋ค.
- ์ด๋ ๊ฒ ์ฌ๋ฌ ํ์ผ์ ๋๋์ด์ ธ ์๋ ์ฝ๋๋ค๋ ๋ค๋ฅธ ๊ณณ์์ ํ๋์ module๋ก ๋ถ๋ฌ์์ ์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ๋๊ฒ์ด package ์ด๋ค.
- Package๋ ํ์ด์ฌ ํ์ผ๋ค๋ก ์ด๋ฃจ์ด์ ธ ์๋ ๋๋ ํ ๋ฆฌ(directory)๊ฐ ํ๋์ package๊ฐ ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ๋๋ ํ ๋ฆฌ ์ด๋ฆ์ด package ์ด๋ฆ์ด ๋๋ค.
import pkg.mod1
from pkg.mod2 import func2
pkg.mod1.func2()
func2()
- ํจํค์ง๋ ์ผ๋ฐ ๋ชจ๋์ฒ๋ผ importํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
- ์ฐจ์ด์ ์ ํด๋์ค ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ๋ ์ฒ๋ผ "dot notation" ์ผ๋ก ํด๋น package์ ์ํ๋ ๋ชจ๋์ import ํ๋ฉด ๋๋ค.
Package Initialization
- ๊ฐ๋์ package๊ฐ import ๋ ๋ ์ด๊ธฐ ์ค์ ์ ํด์ค์ผ ํ ๋๊ฐ ์๋ค.
- ํ์ด์ฌ์
__init__.py
ํ์ผ์ ํตํด package ์ด๊ธฐ ์ค์ ์ ๊ฐ๋ฅํ๊ฒ ํด์ค๋ค.
- Package ์์
__init__.py
ํ์ผ์ด ์์ผ๋ฉด package๊ฐ import ๋ ๋ __init__.py
ํ์ผ์ ์ฝ๋๋ค์ด ์๋์ผ๋ก ์คํ๋๋ค.
__init__.py
ํ์ผ์ ํตํ์ฌ ์ ํํ ๋ฌด์์ ํ ์ ์๋๊ฑธ๊น?
- Import ํ ๋ ๊ฒฝ๋ก์ ์ด ๊ธธ์ด ์ค์ฌ์ฃผ๊ธฐ
- Package์์ import ํ ์ ์๋ ๋ณ์/ํจ์/ํด๋์ค ์ ํํ๊ธฐ
- ๊ทธ ์ธ package๊ฐ import๋ ๋ ๊ผญ ๋จผ์ ์คํ๋์ด์ผ ํ๋ ์ฝ๋๋ค
Import ํ ๋ ๊ฒฝ๋ก์ ์ด ๊ธธ์ด ์ค์ฌ์ฃผ๊ธฐ
- ํ์ฌ
pkg
์์ mod1
์ func2
๋ผ๋ ํจ์๋ฅผ import
ํ์ฌ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ด ํด์ผํ๋ค.
import pkg.mod1
pkg.mod1.func2()
func2
ํจ์๋ฅผ ํธ์ถ ํ ๋๋ง๋ค ๋งค๋ฒ ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ๋ค ํ์
ํด์ค์ผ ํ๊ธฐ๋๋ฌธ์ ๋ฒ๊ฑฐ๋กญ๋ค.
__init__.py
ํ์ผ์ ํตํด ํจ์์ ๊ฒฝ๋ก๋ฅผ ์ค์ฌ์ค ์ ์๋ค.
__init__.py
ํ์ผ์ ๋จผ์ ํ๋ฒ import ํด์ฃผ๋ฉด ๋๋ค.
from .mod1 import func2
from pkg import func2
func2()
Package์์ import ํ ์ ์๋ ๋ณ์/ํจ์/ํด๋์ค ์ ํํ๊ธฐ
__init.py__
ํ์ผ์ ์ฌ์ฉํด์ import
ํ ์ ์๋ ๋ณ์/ํจ์/ํด๋์ค๋ฅผ ์ ํํ ์ ์๋ค.
- ๋ชจ๋์ ๋ชจ๋ ํจ์๊ฐ ๋ค ์ธ๋ถ๋ก ๋
ธ์ถ๋ ์ ์๋๊ฑด ์๋์ ์๋ค. ๋ด๋ถ์ ์ผ๋ก๋ง ์ฌ์ฉ๋์ด์ผ ํ๋ ํจ์๋ ์์์ ์๋ค.
- ์ด๋ฌํ ํจ์๊ฐ package ์ธ๋ถ์์ import๋์ด ์ฌ์ฉ๋๋ ๊ฒ์ ๋ง๊ธฐ ์ํด์๋
__all__
๋ณ์๋ฅผ ์ง์ ํด ์ค ์ ์๋ค.
- package๋ฅผ ํตํด import ๋ ์ ์๋ ์์๋ค์ ๋ชจ๋
__all__
๋ณ์๋ฅผ ํตํด ์ ์ ๋๋ค.
__all__
๋ณ์์ default ๊ฐ์ ๋ชจ๋ ํจ์/๋ณ์/ํด๋์ค ์ด๋ค.
- ๊ทธ๋ฌ๋ฏ๋ก
__all__
๋ณ์๋ฅผ ๋ฐ๋ก ์ ์ํด์ค์ผ๋ก import ๋ ์ ์๋ ์์๋ค์ ์ ํํ ์ ์๋ ๊ฒ์ด๋ค.
__all__
๋ณ์๋ string ๊ฐ์ ์์๋ฅผ ๊ฐ์ง๊ณ ์๋ list ์ด๋ค. (list of strings).
- ๊ทธ๋ฌ๋ฏ๋ก import ๋๊ธธ ์ํ๋ ์์๋ค์ string์ผ๋ก list์ ์ ์ธํด์ฃผ๋ฉด ๋๋ค.
from .mod1 import func2
from .mod2 import func3
__all__ = ['func2', 'func3']
from pkg import *
func2()
func3()
func4()
๋ค๋ฅธ ์ฌ๋์ package ์ฌ์ฉํ๊ธฐ
- ๋ค๋ฅธ ์ฌ๋์ด ๋ง๋ค package๋ฅผ import ํ์ฌ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋จผ์ package๋ฅผ ์ค์น๋ฅผ ํด์ผ ํ๋ค.
- ์๋ฅผ ๋ค์ด, Django ๋ผ๋ package๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋จผ์ ์ค์น๋ฅผ ํด์ผํ๋ค.
- ํ์ด์ฌ์์ package๋ฅผ ์ค์นํ๋ ์ผ์ ๋งค์ฐ ๊ฐ๋จํ๋ค (์ผ๋ฐ์ ์ผ๋ก. ๊ฐ๋จํ์ง ์์ package๋ ์๋ค).
pip
๋ผ๋ ํด์ ์ฌ์ฉํ๋ฉด ๋๋ค. pip
๋ ํ์ด์ฌ์ package manager๋ค.
- ํ์ด์ฌ์ ์ค์นํ๋ฉด ๊ฐ์ด ์ค์น๊ฐ ๋๋ฉฐ
pip
๋ ํฐ๋ฏธ๋์์ ๋ค์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
pip install Django
How import statement finds modules and packages
- ํ์ด์ฌ์ด module๊ณผ package๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ
- ํ์ด์ฌ์ ๋ค์ 3๊ฐ์ง ์ฅ์๋ฅผ ์์๋๋ก ๋ณด๋ฉด์ ์ฐพ์ต๋๋ค.
- sys.modules
- built-in modules
- sys.path
sys.modules
- ํ์ด์ฌ์ด ๋ชจ๋์ด๋ package๋ฅผ ์ฐพ๊ธฐ์ํด ๊ฐ์ฅ ๋จผ์ ํ์ธํ๋ ๊ณณ์ด๋ค.
- sys.modules๋ ๋จ์ํ dictionary๋ค.
- ์ด๋ฏธ import๋ ๋ชจ๋๊ณผ package๋ค์ ์ ์ฅํ๊ณ ์์ต๋๋ค.
- ์ฆ, ํ๋ฒ import๋ ๋ชจ๋๊ณผ package๋ค์ ํ์ด์ฌ์ด ๋ ๋ค์ ์ฐพ์ง ์์๋ ๋๋๋ก ํ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค.
- ๊ทธ๋ฌ๋ฏ๋ก ์๋ก import ํ๋ ๋ชจ๋์ sys.modules ์์ ์ฐพ์ ์ ์์ต๋๋ค.
built-in modules
- ํ์ด์ฌ์์ ์ ๊ณตํ๋ ํ์ด์ฌ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค
- Built-in ๋ชจ๋๋ค์ ์ด๋ฏธ ํ์ด์ฌ์ ํฌํจ๋์ด ๋์ค๋ฏ๋ก ํ์ด์ฌ์ด ์ฝ๊ฒ ์ฐพ์ ์ ์๋ค.
sys.path
- ๋ง์ง๋ง์ผ๋ก ๋ณด๋ ์ฅ์๊ฐ ๋ฐ๋ก sys.path ์ด๋ค.
- sys.path๋ ๊ธฐ๋ณธ์ ์ผ๋ก list์ด๋ฉฐ string ์์๋ค์ ๊ฐ์ง๊ณ ์๋ 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 ํ๊ณ ์ ํ๋ 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
์๋ฌ๋ฅผ ๋ฆฌํดํฉ๋๋ค.
Absolute Path & Relative Path
- ํ๋ก์ ํธ ๋ด์์ ์ด๋ ํ์ผ, ์ด๋ ์์น์์ import ํ๋์ง ๊ฒฝ๋ก๊ฐ ํญ์ ๊ฐ์ด ๋์ผํ๊ฒ ๋๋ฏ๋ก absolute path ๋ผ๊ณ ํ๋ ๊ฒ์ด๋ค.
- ์ผ๋ฐ์ ์ผ๋ก local package๋ฅผ import ํ ๋๋ absolute path๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
- absolute path์ ๋จ์
๊ฒฝ๋ก๊ฐ ๊ธธ์ด์ง ์ ์๋ค๋ ์
- relative path
absolute path์ ๋จ์ ์ ๋ณด์
- Relative path ๋ absolute path์ ๋ค๋ฅด๊ฒ ํ๋ก์ ํธ์ ์ต์๋จ ๋๋ ํ ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒฝ๋ก๋ฅผ ์ก๋๊ฒ ์๋๋ผ import ํ๋ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒฝ๋ก๋ฅผ ์ ์ํ๋ค.
- ๊ทธ๋์ ์ผ๋ฐ์ ์ผ๋ก relative path๋ local package ์์์ ๋ค๋ฅธ local package๋ฅผ import ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, package2
์ module3
์์ package2
์ class1
๊ณผ package2
์ ํ์ package์ธ subpackage1
์ module5
์ function2
ํจ์๋ฅผ import ํ๋ ค๊ณ ํ๋ฉด ๋ค์ ์ฒ๋ผ ํ ์ ์์ต๋๋ค.
from . import class1
from .subpackage1.module5 import function2
- ์ฌ๊ธฐ์ dot
.
์ import ๊ฐ ์ ์ธ๋๋ ํ์ผ์ ํ์ฌ ์์น๋ฅผ ์ด์ผ๊ธฐ ํ๋ค.
- ํ์ฌ์์น๋
package2/module3.py
์ด๋ฏ๋ก ํ์ฌ ์์น์์๋ถํฐ ์ํ๋ ๋ชจ๋์ ๊ฒฝ๋ก๋ง ์ ์ธํด์ฃผ๋ฉด ๋๋ ๊ฒ์ด๋ค.
- ๋ํ dot 2๊ฐ๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค. dot 2๊ฐ
..
๋ ํ์ฌ์์น์์ ์์ ๋๋ ํ ๋ฆฌ๋ก ๊ฐ๋ ๊ฒฝ๋ก๋ค.
from ..module4 import class4
- Relative path๋ ์ ์ธํด์ผ ํ๋ ๊ฒฝ๋ก์ ๊ธธ์ด๋ฅผ ์ค์ฌ์ค๋ค๋ ์ฅ์ ์ ์์ง๋ง ํท๊ฐ๋ฆฌ๊ธฐ ์ฝ๊ณ ํ์ผ ์์น๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๊ฒฝ๋ก ์์น๋ ๋ณ๊ฒฝ๋์ด์ผ ํ๋ ๋จ์ ์ด ์๋ค.
- ๊ทธ๋ฌ๋ฏ๋ก ์ฌ๋งํ ๊ฒฝ์ฐ absolute path๋ฅผ ์ฌ์ฉํ๋๊ฒ ๊ถ์ฅ๋๋ค.
sys.modules ์ sys.path์ ์ฐจ์ด์
- sys.modules๋ ํ์ด์ฌ์ด ๋ชจ๋์ด๋ ํจํค์ง๋ฅผ ์ฐพ๊ธฐ ์ํด ์ ์ผ ๋จผ์ ํ์ธํ๋ ๊ณณ์ด๊ณ sys.path๋ ๊ฐ์ฅ ๋ง์ง๋ง์ผ๋ก ๋ณด๋ ์ฅ์์ด๋ค.
- sys.modules์ ๋จ์ํ dictionary์ด๊ณ sys.path๋ string ์์๋ฅผ ๊ฐ์ง๊ณ ์๋ list์ด๋ค.
sys ๋ import ํด์ผํ๋ ๋ชจ๋์
๋๋ค. ํ์ด์ฌ์ sys ๋ชจ๋์ ์์น๋ฅผ ์ด๋ป๊ฒ ์ฐพ์ ์ ์์๊น์?
import sys
print(sys.path)
print(sys.modules)
Absolute path์ relative path์ ์ฐจ์ด์ ์ ์์ ํด ์ฃผ์ธ์.
- ํ์ด์ฌ์ built-in ๋ชจ๋๊ณผ pip ์ ํตํด ์ค์นํ ์ธ๋ถ ๋ชจ๋ ๋ฐ package๋ ์ผ๋ฐ์ ์ผ๋ก import ํ๋๋ฐ ํฐ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค.
Abosolute path & relative path
- ์ ๋ ๊ฒฝ๋ก์ ์๋ ๊ฒฝ๋ก
- ๋ ๋ค local package๋ฅผ importํ๋ ๊ฒฝ๋ก์ด๋ค.
- absolute path๋ ์ด๋ ๊ฒฝ๋ก์์ importํ๋์ง ์ต์์ ๋๋ ํ ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒฝ๋ก๋ฅผ ์ก๋๋ค.
- absolute path์ ๋จ์ ์ด ๊ฒฝ๋ก๊ฐ ๊ธธ์ด์ง๋ค๋ ๊ฒ์ธ๋ฐ ๊ทธ ๋จ์ ์ ๋ณด์ํ ๊ฒ์ด relative path์ด๋ค.
- relative path๋ absolute path์ ๋ค๋ฅด๊ฒ ํ๋ก์ ํธ์ ์ต์๋จ ๋๋ ํ ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒฝ๋ก๋ฅผ ์ก๋๊ฒ ์๋๋ผ import๋ผ๋ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒฝ๋ก๋ฅผ ์ ์ํ๋ค.
main.py์์ ์๋๊ฒฝ๋ก๋ก add_and_mutiply ๋ฅผ ์ํฌํธ ํ์ ๋ ๋ฐ์ํ๋ ์๋ฌ๋ฅผ ํ์ธํ๊ณ , main module ์์๋ ํจํค์ง์ ๋ชจ๋์ ์ด๋ป๊ฒ ์ํฌํธ ํด์ผํ๋์ง ์ ์ด๋ณด์.
main.py
from .calculator.add_and_multiply import add_and_multiply
if __name__ == '__main__':
print(add_and_multiply(1,2))
hyerim@hyerim-15U340-LT2CK:~$ python3 main.py
Traceback (most recent call last):
File "main.py", line 6, in <module>
from .calculator.add_and_multiply import add_and_multiply
ImportError: attempted relative import with no known parent package
- ์๋ main.py์์ ์๋๊ฒฝ๋ก๋ก add_and_mutiply๋ฅผ ์ํฌํธ ํ์ ๋ ๋ฐ์ํ๋ ์๋ฌ์ด๋ค.
- ImportError: attempted relative import with no known parent package
- ํ์ด์ฌ ์๋๊ฒฝ๋ก ์๋ฌ
- ์์ธ?
- python interpreter๋ relative import์ module ์์น๋ฅผ ์ ํ ๋ ์ฆ, ๊ธฐ์ค์ด ๋๋ ๋ชจ๋์ ์์น๋ฅผ ์ ํ
name์์ฑ์ ์ํด ๊ฒฐ์ ๋๋ค.
- main ๋ชจ๋์์ ์๋๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ํ์ด์ฌ์ด ์๋๊ฒฝ๋ก์ ์ถ๋ฐ์ , ์ฆ main ๋ชจ๋์ ์์น๋ฅผ ์ฐพ์ง ๋ชปํ๋ค.
- ํฐ๋ฏธ๋์์ ์ง์ python ํ์ผ์ ์คํ์ํฌ ๋ name == 'main' ์ด ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋น์ฐํ main์ด๋ผ๋ ๋ชจ๋์ ์์น๋ฅผ ํ์ด์ฌ interpreter๋ ์ ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
- ํด๊ฒฐ๋ฐฉ์?
- python ์ -m ์ต์
์ ์ด์ฉํ๋ค.
- m mod : run library module as a script (terminates option list)
- m ์ต์
์ ๋ชจ๋์ ์คํฌ๋ฆฝํธ๋ก ์ํํ ๋ ์ฐ๋ ์ต์
์ด๋ค.(์ฆ, ๋ชจ๋์ด์ผ ๋ผ๊ณ ๋งํด์ฃผ๋ ๊ฒ์ด๋ค.)
- ์ ๋๊ฒฝ๋ก๋ฅผ ์ด์ฉํ๋ค.
- ๋ชจ๋์คํ ๋ค ์๋๊ฒฝ๋ก๋ฅผ ํตํด ๋ค๋ฅธ ๋ชจ๋์ import ํ ๋,
ํ์ด์ฌ์ ๋ชจ๋์ ์ด๋ฆ( name )์ ๊ธฐ๋ฐ์ ๋๊ณ ํ์ฌ๋ชจ๋์ ์์น๋ฅผ ์ฐพ๋๋ค.
- ๋ฉ์ธ ๋ชจ๋์ ์ด๋ฆ์ด ํญ์ "main"์ด๋ฏ๋ก ํ์ด์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฉ์ธ ๋ชจ๋๋ก ์ฌ์ฉ๋๋ ๋ชจ๋์ ํญ์ ์ ๋ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
- ์ด๋ฆ์ด main์ผ๋ก ๋ฐ๊ปด๋ฒ๋ฆฐ ๋ชจ๋์ ํ์ด์ฌ์ด ์์น๋ฅผ ์ฐพ์ ์ ๊ฐ ์๋ค. ์๋๊ฒฝ๋ก์ ์ถ๋ฐ์ ์ด ๋๋ ์์น๋ฅผ ๋ชป์ฐพ์ ์์ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด๋ค.
from calculator.add_and_multiply import add_and_multiply
if __name__ == '__main__':
print(add_and_multiply(1,2))
- ์์ฒ๋ผ ๊ฒฝ๋ก๋ฅผ ์ ๋ ๊ฒฝ๋ก๋ก ๋ฐ๊ฟ์ฃผ๋ฉด
hyerim@hyerim-15U340-LT2CK:~$ python3 main.py
5
- main.py๋ฅผ ์คํํ์ ๋ ์ ์คํ๋๋ค.
add_and_multiply.py์์ multiplyํจ์๋ฅผ ์ ๋๊ฒฝ๋ก์ ์๋๊ฒฝ๋ก๋ ๊ฐ๊ฐ ์ํฌํธ ํด๋ณด๊ณ main ๋ชจ๋๊ณผ ์ฐจ์ด์ ์ ์๊ฐํด๋ณด๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํด ๋ณด์ธ์.
์ ๋๊ฒฝ๋ก
#!/usr/bin/python3
from multiplication import multiply
# from calculator.multiplication import multiply
def add_and_multiply(a,b):
return multiply(a,b) + (a+b)
print(add_and_multiply(1, 2))
~
hyerim@hyerim-15U340-LT2CK:~/calculator$ python3 add_and_multiply.py
5
- ์ ๋ ๊ฒฝ๋ก ์ ์์ ์ผ๋ก ์๋๋จ
์๋๊ฒฝ๋ก
#!/usr/bin/python3
from .multiplication import multiply
# from calculator.multiplication import multiply
def add_and_multiply(a,b):
return multiply(a,b) + (a+b)
print(add_and_multiply(1, 2))
~
hyerim@hyerim-15U340-LT2CK:~/calculator$ python3 add_and_multiply.py
Traceback (most recent call last):
File "add_and_multiply.py", line 2, in <module>
from .multiplication import multiply
ImportError: attempted relative import with no known parent package
- ImportError: attempted relative import with no known parent package
init.py ํ์ผ์ ์ญํ
- ํ์ผ ์์ ์๋ฌด ์ฝ๋๋ ์์ง๋ง ํ์ผ์ด ์ํด์๋ ๋๋ ํ ๋ฆฌ๊ฐ ํจํค์ง์์ ์๋ ค์ฃผ๋ ์ญํ ์ ํ๋ค.
<์ฐธ๊ณ >