ํ์ด์ฌ์ ๋ด์ฅ๋์ด ์๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ , ๋ชจ๋๊ณผ ํจํค์ง๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์.
๋ชจ๋์ ๊ฐ์ฒด(๋ณ์, ํจ์, ํด๋์ค ๋ฑ)์ ๋ชจ์๋์ ํ์ผ์ด๋ค. ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉํ๊ฑฐ๋ ์ฝ๋๋ฅผ ๋๋์ด ์ ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
์๋ฅผ ๋ค์ด ์๋ฃ๊ตฌ์กฐ์ ๊ธธ์ด๋ฅผ ๊ตฌํ ๋ len()
๋ด์ฅ ํจ์๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋๋ฐ, ํ์ด์ฌ์์ ๋ชจ๋๋ก ์ด๋ฏธ ๊ตฌํํด๋์๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์ ์ํ์ง ์์๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
ํ์ด์ฌ์ ํ์ผ ์ด๋ฆ > ๋ชจ๋ ์ด๋ฆ ์์ผ๋ก ๋ด์ฉ์ ์ฐพ๊ธฐ ๋๋ฌธ์, ๋จผ์ ํ์ผ ์ด๋ฆ์ ์๋ ค์ค์ผ ํ๋ค. ์ด๋ฌํ ๊ตฌ์กฐ๋ฅผ "name space" ๋ผ๊ณ ํ๋ค. ์ด๋ฆ์ ๊ณต๊ฐ ํน์ ์์ญ์ ์๋ ค์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
import module_name
module_name.module_function # ๋ชจ๋์์ ์ฌ์ฉํ๊ธธ ์ํ๋ ๋ณ์/ํจ์/ํด๋์ค ์ด๋ฆ
from module_name import mu_func, my_var, my_class
from
ํค์๋๋ฅผ ์ฌ์ฉํด ๋ชจ๋ ๋ด์ ์ํ๋ ํจ์, ํด๋์ค๋ง ๊ฐ์ ธ์ฌ ์ ์๋ค. ์๋์ ๊ฐ์ด ๋ณ ๋ชจ์(all)์ผ๋ก ๋ชจ๋ ๋ด์ฉ์ ๋ถ๋ฅผ ์๋ ์์ง๋ง, local scope์ ๊ฐ์ฒด์ ์ด๋ฆ ์ถฉ๋์ด ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๊ถ์ฅ๋์ง ์๋๋ค. (?)
from my_module import my_module_func, my_module_var
print(my_module_var)
my_module_func()
from my_module import* # *์ ๋ชจ๋ ๊ฒ์ ๋ปํ๋ค.
print(my_module_var)
my_module_func()
๋ชจ๋์ ๊ฐ์ ธ์จ ๋ค ์ฌ์ฉํ๊ฒ ๋ ๊ฒฝ์ฐ ๋ชจ๋์ด๋ฆ.ํจ์ ๋ก ๋ถ๋ฌ์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด๋ฆ์ด ๊ธธ๋ฉด ๋ฒ๊ฑฐ๋ก์ธ ์ ์๋ค. ํด๋น ํ์ผ์์ ์ด๋ค ์ด๋ฆ์ผ๋ก ๋ถ๋ฅผ๊ฑด์ง ์ ํ ์๋ ์๋ค.
from my_module3 import function_with_name_too_long as f3
f1()
f2()
f3()
(์ฐธ๊ณ ๋ฌธ์) ํ์ด์ฌ์ ์๋ ๋ชจ๋ ๊ฐ์ฒด๊ฐ ํน๋ณํ ์ด๋ฆ์ ๊ฐ์ง ์ ์๋๋ก ํ๋ ์์คํ ์ด๋ค. ๊ฐ์ฒด๋ ๋ณ์๋ ํจ์๊ฐ ๋ ์ ์๊ณ name space๋ ๋์ ๋๋ฆฌ ํํ๋ก ๊ฐ์ง๊ณ ์๋ค.
๋ง์ฝ ๋ฐ์ ์ฌ๋ฌ ๋ช ์ ์์์ด๊ฐ ์๋ค๋ฉด ํ ๋ช ์ ํน์ ํด์ ์ฐพ๊ธฐ ์ด๋ ค์ธ ๊ฒ์ด๋ค.ํ์ง๋ง ์ฑ์ ๋ถ์ด๊ฑฐ๋ ๋ณ๋ช ์ ๋ถ์ด๋ฉด ํ ๋ช ์ผ๋ก ํน์ ํ ์ ์๋ค.
name space๋ ๋น์ทํ ์๋ฆฌ๋ค. ์ด๋ค ๋ณ์๋ ํจ์๋ฅผ ์ฌ์ฉํ๋์ง ์ ํํ ์์์ผ ํ๊ธฐ ๋๋ฌธ์, name space๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋จ์ด ๊ตฌ๋ถ์ ํ ๋ ์กฐ๊ธ์ ์ ๋ณด๋ฅผ ๋์ถ๊ฐํ๋๊ฑฐ๋ค
module๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ค๋ฅธ ํ์ผ์์ ๊ฐ์ฒด๋ฅผ ๋ถ๋ฌ์ ์ฌ์ฉํ๋ ๊ฐ๋ ์ธ๋ฐ, ๋ ํฌ๊ณ ๋ณต์กํ ์ฝ๋๋ฅผ ๊ฐ๊ณ ์๋ค.
ํ์ด์ฌ ํ์ผ๋ค๋ก ์ด๋ฃจ์ด์ ธ ์๋ ๋๋ ํ ๋ฆฌ(directory)๊ฐ ํ๋์ package๊ฐ ๋๊ณ , ๋๋ ํ ๋ฆฌ ์ด๋ฆ์ด package ์ด๋ฆ์ด ๋๋ค.
Package๋ ์ผ๋ฐ ๋ชจ๋ ์ฒ๋ผ import ํ์ฌ ์ฌ์ฉํ๊ณ , ํด๋์ค ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ๋ ์ฒ๋ผ "dot notation" ์ผ๋ก ์ํ๋ ๋ชจ๋์ importํ๋ค.
import pkg.mod1 # pkg์ mod1์ ๋ถ๋ฌ์ค๊ธฐ
from pkg.mod2 import func2 #pkg mo2์ func2๋ง ๋ถ๋ฌ์ค๊ธฐ
pkg.mod1.func2()
func2()
package๊ฐ import ๋ ๋ ์ด๊ธฐ ์ค์ ์ ํด์ค์ผ ํ ๋๊ฐ ์๋ค. ํ์ด์ฌ์ __init__.py
ํ์ผ์ ํตํด package๋ฅผ ์ด๊ธฐ ์ค์ ํ๊ณ ์ด๋ฅผ Package Initialization์ด๋ผ๊ณ ํ๋ค. ํจํค์ง ์์ ํด๋น ํ์ผ์ด ์์ผ๋ฉด, ์ฝ๋๊ฐ ์๋์ผ๋ก ์คํ๋๋๋ฐ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ๋ค.
ํจํค์ง์ init ํ์ผ์์ ๋จผ์ ํ๋ฒ import๋ฅผ ํด์ฃผ๋ฉด, ๋ด๊ฐ ํจํค์ง๋ฅผ ์ฌ์ฉํ main ํ์ผ์์ ๋ชจ๋์ ์ค๋ณต์ผ๋ก ์ฌ์ฉํ ํ์๊ฐ ์๋ค.
# __init__.py
from mod1 import func2
# main.py
from pkg import func2
func2()
๋ด๋ถ์ ์ผ๋ก๋ง ์ฌ์ฉ๋์ด์ผ ํ๋ ๊ฐ์ฒด๊ฐ package ์ธ๋ถ์์ import ๋ฐ ์ฌ์ฉ๋๋ ๊ฒ์ ๋ง๊ธฐ ์ํด __all__
๋ณ์๋ฅผ ์ง์ ํด ์ค ์ ์๋ค.
all ๋ณ์์ default ๊ฐ์ ๋ชจ๋ ํจ์/๋ณ์/ํด๋์ค์ด๊ณ , init ํ์ผ์์ ๋ฐ๋ก ์ ์ํด import๋ ์ ์๋ ์์๋ฅผ ์ ํํ๋ค. __init__
์ string ์์๋ฅผ ๊ฐ์ง๋ list์ด๊ณ import๋ฅผ ์ํ๋ ์์๋ฅผ list์ ์ ์ธํ๋ฉด ๋๋ค.
# __init__.py
from mod1 import func2
from mod2 import func3
__all__ = ['func2', 'func3'] # ์ฌ์ฉ๋ ํจ์๋ฅผ ์ ํ
# main.py
from pkg import *
func2()
func3()
func4() ## Error. func4 ํจ์๋ __all__ ์ ์ ์๋์ง ์์์ผ๋ฏ๋ก import ๋ ์ ์์.
import statement๋ ๋ชจ๋๊ณผ ํจํค์ง๋ฅผ ์ด๋ป๊ฒ ์ฐพ์๊น? ํ์ด์ฌ์ ๋ค์ 3๊ฐ์ง ์ฅ์๋ฅผ ์์๋๋ก ๋ณด๋ฉด์ ์ฐพ๋๋ค.
ํ์ด์ฌ์ด ๋ชจ๋์ด๋ package๋ฅผ ์ฐพ๊ธฐ์ํด ๊ฐ์ฅ ๋จผ์ ํ์ธํ๋ ๊ณณ์ด๋ค. sys.modules๋ ๋จ์ํ dictionary๊ณ , ์ด๋ฏธ import๋ ๋ชจ๋๊ณผ package๋ค์ ์ ์ฅํ๊ณ ์๋ค.
์ฆ, ํ๋ฒ import๋ ๋ชจ๋๊ณผ package๋ค์ ํ์ด์ฌ์ด ๋ ๋ค์ ์ฐพ์ง ์์๋ ๋๊ณ ์๋ก import ํ๋ ๋ชจ๋์ sys.modules ์์ ์ฐพ์ ์ ์๋ค.
ํ์ด์ฌ์์ ์ ๊ณตํ๋ ํ์ด์ฌ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ. Built-in ๋ชจ๋๋ค์ ์ด๋ฏธ ํ์ด์ฌ์ ํฌํจ๋์ด ๋์ค๋ฏ๋ก ํ์ด์ฌ์ด ์ฝ๊ฒ ์ฐพ์ ์ ์๋ค.
๋ง์ง๋ง์ผ๋ก ๋ณด๋ ์ฅ์๊ฐ ๋ฐ๋ก sys.path์ด๋ค. sys.path๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฒฝ๋ก๋ฅผ string type์ผ๋ก ๊ฐ์ง๊ณ ์๋ list์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก ํ์ด์ฌ์ list์ ๊ฐ ๊ฒฝ๋ก๋ฅผ ํ๋ ํ๋ ๋ณด๋ฉฐ ํด๋น ๊ฒฝ๋ก์ import ํ๊ณ ์ ํ๋ package๊ฐ ์์นํ๋์ง ํ์ธํ๋ค. sys.path ์์๋ ๋ชป์ฐพ์ผ๋ฉด ModuleNotFoundError ์๋ฌ๋ฅผ ๋ฆฌํดํ๋ค.
built-in์ด ์๋ ํจํค์ง๊ฐ ์๋ ๋๋ ํ ๋ฆฌ์ด๋ค. pip ์ผ๋ก ์ค์นํ ์ธ๋ฌด ๋ชจ๋์ ์๋์ผ๋ก site-packages ๋ผ๋ ๋๋ ํ ๋ฆฌ์ ์ค์น๋๊ณ , ์ด๋ sys.path์ ์ด๋ฏธ ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ฐพ๋๋ฐ ๋ฌธ์ ๊ฐ ์๋ค.
local package๋ฅผ import ํ ๋๋ ํด๋น package์ ์์น์ ๋ง๊ฒ import ๊ฒฝ๋ก๋ฅผ ์ ์ ์ธํด์ผ ํ๋ค. Local package๋ฅผ import ํ๋ ๊ฒฝ๋ก์๋ absolute path ์ relative path ๊ฐ ์๋ค.
** ๋งํฌ๋ค์ด์์ ๋์ด์ฐ๊ธฐ๊ฐ ๋ฒ๊ฑฐ๋ก์ฐ๋ฏ๋ก ํ์ผ์ ๊ณ์ธต์ ์ด๋ฏธ์งํํ์ง ์์๋ค. my_app์ด๋ผ๋ ํ๋ก์ ํธ๋ ๋ ๊ฐ์ ํจํค์ง(package 1,2)๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, package2๋ subpackage๋ผ๋ ์ค์ฒฉ ํจํค์ง๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
โโโ my_app
โโโ main.py
โโโ package1
โโโ module1.py
โโโ module2.py
โโโ package2
โโโ init.py
โโโ module3.py
โโโ module4.py
โโโ subpackage1
โโโ module5.py
์ ๋ ๊ฒฝ๋ก. import๋ฅผ ํ๋ ํ์ผ์ด๋ ๊ฒฝ๋ก์ ์๊ด์์ด ํญ์ ๊ฒฝ๋ก๊ฐ ๋์ผํ๊ณ , ๊ฒฝ๋ก๋ค์ ์์์ ์ด ์ ๋ถ "my_app" ํ๋ก์ ํธ์ ๊ฐ์ฅ ์ต์์ ๋๋ ํ ๋ฆฌ๋ค. (์ด๋ฏธ my_app ํ๋ก์ ํธ ์์ ์์ผ๋ฏ๋ก my_app์ ์๋ต)
from package1 import module1
from package1.module2 import function1
from package2 import class1
from package2.subpackage1.module5 import function2
์ฐธ๊ณ ๋ก current directory ๋ผ๊ณ ํ๋ ํ์ฌ์ ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ๋ default๋ก sys.path ์ ํฌํจ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก absolute path๋ current directory ๋ก ๋ถํฐ ๊ฒฝ๋ก๋ฅผ ์์ํ๊ฒ ๋๋ค.
๋ฐ๋ฉด Relative path ๋ import ํ๋ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒฝ๋ก๋ฅผ ์ ์ํ๋ค. ๊ทธ๋์ local package ์์์ ๋ค๋ฅธ local package๋ฅผ import ํ ๋ ์ฌ์ฉ๋์ง๋ง, ํ์ผ์ ์์น๊ฐ ๋ฐ๋๋ฉด ์ฌ์ ์ํด์ผํ๊ณ ๋ถ๋ฌ์ฌ ๋ ํท๊ฐ๋ฆด ์ ์์ด ์ ๋ ๊ฒฝ๋ก๊ฐ ๊ถ์ฅ๋๊ธด ํ๋ค.
package2์ module3์์ package2์ class1๊ณผ package2์ ํ์ package์ธ subpackage1์ module5์ function2 ํจ์๋ฅผ importํด๋ณด์.
# package2/module3.py
from . import class1
from .subpackage1.module5 import function2
# subpackage1/module5.py
from ..module4 import class4
sys ๋ชจ๋์ ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ๊ฐ ์ ๊ณตํ๋ ๋ณ์์ ํจ์๋ฅผ ์ง์ ์ ์ดํ ์ ์๊ฒ ํด์ฃผ๋ ๋ชจ๋์ด๋ค. ๋ต์ ์ฐพ๊ธฐ ์ ์ sys ๋ชจ๋์ ๋ํด ๋ ์์ธํ ์ฐพ์๋ณด์๋ค. ๊ณต์ ๋ฌธ์์์๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ๋ค.
์์คํ ํน์ ํ๋ผ๋ฏธํฐ, ํจ์ (System - specific parameters and funcions)
์ธํฐํ๋ฆฌํฐ์ ์ํด ์ฌ์ฉ๋๊ฑฐ๋, ์ ์ง๋๊ณ ์๋ ๋ณ์ & ์ธํฐํ๋ฆฌํฐ๊ฐ ๊ฐ๋ ฅํ๊ฒ ์ํธ์์ฉํ๋ ํจ์์ ์ ๊ทผํ ์ ์๋๋ก ํด์ฃผ๋ ๋ชจ๋. ํญ์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. (It is always available)
๊ฐ๋จํ ์์๋ก ํด๋น ๋ชจ๋์ด ์ด๋ค ๊ธฐ๋ฅ์ ํ๋์ง ์ดํด๋ณด์.
๋ช
๋ นํ์ ์ธ์๋ฅผ ๋ฐ๋ ๊ฒ. python ๋ช
๋ น์ด ๋ค์ ๋ชจ๋ ๊ฒ๋ค์ด ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ๋๋์ด์ sys.argv ๋ฆฌ์คํธ์ ์์๊ฐ ๋๋ค. ๋ง์ฝ ๋ช
๋ น์ ์ธํฐํ๋ฆฌํฐ์ -c
command line option์ ์ฌ์ฉํด์ ์คํํ๋ค๋ฉด argv[0]๋ '-c'๋ก ๋ฐ๋๋ค. ๋ง์ฝ ์ธํฐํ๋ฆฌํฐ์ pass๋๋ script name์ด ์๋ค๋ฉด argv[0]์ ๋น ๋ฌธ์์ด์ด ๋๋ค.
๊ฐ์ ๋ก ์คํฌ๋ฆฝํธ ์ข ๋ฃํ๊ธฐ. Ctrl+Z๋ Ctrl+D๋ฅผ ๋๋ฌ์ ๋ํํ ์ธํฐํ๋ฆฌํฐ๋ฅผ ์ข ๋ฃํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ํ๋ค. ํ๋ก๊ทธ๋จ ํ์ผ ์์์ ์ฌ์ฉํ๋ฉด ํ๋ก๊ทธ๋จ์ ์ค๋จ์ํจ๋ค.
ํฐ๋ฏธ๋์์ sys๋ฅผ importํ๊ณ module์ ์จ๋ณด์๋ค. ๋๋ฌด ๊ธธ์ด์ ์ค๊ฐ๊น์ง๋ง ๋ถ์ฌ์๋ค.
import sys
sys.modules
# retult: {'sys': <module 'sys' (built-in)>, 'builtins': <module 'builtins' (built-in)>, '_frozen_importlib': <module '_frozen_importlib' (frozen)>, '_imp': <module '_imp' (built-in)>}
print(sys.modules.keys()) #key๋ง ๋ถ๋ฅผ ๊ฒฝ์ฐ ๋ฆฌ์คํธ๋ก ๋์จ๋ค
# result
'''['os.path', 'os', 'exceptions', '__main__', 'ntpath', 'strop', 'nt','sys', '__builtin__', 'site', 'signal', 'UserDict', 'string', 'stat']'''
ํฐ๋ฏธ๋์์ sys๋ฅผ importํ๊ณ path๋ฅผ ์จ๋ณด๋ ๋ค์๊ณผ ๊ฐ์ด ๋์๋ค.
import sys
sys.path
['', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python37.zip', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload', '/Users/yeni/Library/Python/3.7/lib/python/site-packages', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages']
์ด๊ธฐํ ์ดํ sys.path์ ์ฒซ๋ฒ์งธ ์์ดํ path[0]์ python ์ธํฐํ๋ฆฌํฐ๋ฅผ ๋ถ๋ฌ์ฌ ๋ ์ฌ์ฉ๋ script๋ฅผ ์ ์ฅํ๊ณ ์๋ ๋๋ ํ ๋ฆฌ๋ค. ๋ง์ฝ script ๋๋ ํ ๋ฆฌ๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ฉด ๋ฆฌ์คํธ๋ ๋น ์ํ์ด๋ค. ๊ทธ๋์ command line์ผ๋ก ํ์ด์ฌ์ ์ฐ๋ฉด script๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฒซ ๋ฒ์งธ ์์๊ฐ ''๋ก ํ์๋๋ค. ์ด ๋๋ ํ์ด์ฌ์ด ์ต๊ทผ ๋๋ ํ ๋ฆฌ์์ ๋ชจ๋์ ์ฐพ๊ฒ๋ ํ๋ค.
script๋ ํ๋ก๊ทธ๋จ์ ์คํํ๊ธฐ ์ํด ์ํํ๋ ๋ด์ฉ์ ๋ด๊ณ ์๊ณ , ๊ทธ ์์ฒด๋ก ์คํ์ด ๊ฐ๋ฅํ๋ค. ๋ฐ๋ฉด module์ library์ ์ฐธ์กฐ๋์ด ๊ทธ ์์ฒด๋ก๋ ์คํ์ด ๋ถ๊ฐํํ๊ณ ์ฐ๊ธฐ ์ํด์๋ ๋ถ๋ฌ์์ผ ํ๋ค.
OS์ command line ๋๋ ํฐ๋ฏธ๋์ ์ผ๊ด์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ํ์ด์ฌ์ ๊ตฌ์ฑํ๋ค.
python์ sys.modules > built-in modules > sys.path ์์ผ๋ก ๋ชจ๋์ ์ฐพ๋๋ค. sys๋ built-in module์ด๋ค.
๋๋ฌธ์ import sys๋ฅผ ํ๋ฉด ํ์ด์ฌ์ built-in ๋ชจ๋์์ sys๋ฅผ ์ฐพ์ ์คํํ๋ค.
sys ๋ชจ๋์ ์ธํฐํ๋ฆฌํฐ์ ์๋๋ถํฐ(inherently) ์กด์ฌํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ์ import๋ฅผ ํด์ผ ํ ๊น? ์ฌ์ค ๋๋ ์ฒ์์ sys๋ฅผ ์จ๋ณด๋ ค๊ณ ํ๋๋ฐ import๋ฅผ ๊น๋นกํด์ ๊ณ์ ์ค๋ฅ๊ฐ ๋ฌ๋ค.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'sys' is not defined
๋ต์ผ๋ก stack overflow์ ์ ์ฌ ์ง๋ฌธ์ ์ฐธ๊ณ ํ๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋์ ์ฐ๋ ค๋ฉด ๋ถ๋ฌ์์ผ ํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ถ๋ฅด์ง ์์์ผ๋ก์จ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ ์ ์๋ค๋ ์ ๋ ์๊ธด ํ๋ค.
์ด์จ๋ ํ์ด์ฌ ๊ฐ๋ฐ์ ํ์ ๋ชจ๋์ด ์๋์ ์ผ๋ก import๋์ง ์๋๋ก ๊ฒฐ์ ํ๊ณ , ์ฌ์ฉํ ๋๋ ์์ฒญ์ ํด์ผํ๋ค. ๊ทธ๋์ importํ์ง ์๋ ์ด์ sys๋ ๋ณ์๋ ํจ์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. ์ด ์ ์ ๋น์ถ์ด๋ดค์ ๋, ๋ด์ฅ๋์ง ์์ ๋ชจ๋๋ค์ ํ๋ก๊ทธ๋๋จธ๋ค์๊ฒ ๊ฐ๋ฅํ ๋ง์ ๋ค์ด๋ฐ ์ ํ๊ถ์ ์ฃผ๊ธฐ ์ํด์๋ ์๋ค.
๊ณต์ ๋ฌธ์ 6.1.2. The Module Search Path
๋ชจ๋ spam์ด import๋ ๋, ์ธํฐํ๋ฆฌํฐ๋ built-in module์์spam
์ ์ฐพ๋๋ค. ๋ง์ฝ ์ฐพ์ง ๋ชปํ๋ฉด,spam.py
๋ผ๋ ์ด๋ฆ์ ํ์ผ์ sys.path ๋ณ์์ ์๋ ๋๋ ํ ๋ฆฌ ๋ฆฌ์คํธ์์ ์ฐพ๋๋ค.sys.path๋ ์๋ ๊ฒฝ๋ก์์ ์์๋๋ค.
- input script๋ฅผ ํฌํจํ๋ ๋๋ ํ ๋ฆฌ (์๋ฌด ํ์ผ์ด ์์ผ๋ฉด ๊ฐ์ฅ ์ต๊ทผ ๋๋ ํ ๋ฆฌ)
- PYTHONPATH: shell ๋ณ์ syntax์ ๋๊ฐ์ syntax๋ก, ๋๋ ํ ๋ฆฌ ์ด๋ฆ๋ค์ ๋ฆฌ์คํธ.
- ์ค์น ์์กด์ ์ธ ์ด๊ธฐ๊ฐ (The installation-dependent default)
์ ๋ ๊ฒฝ๋ก๋ ๊ธฐ์ค์ ์ด ์๊ธฐ ๋๋ฌธ์ ํท๊ฐ๋ฆด ์ผ์ด ์๊ณ , ์์๋๋ก๋ง ๊ฒฝ๋ก๋ฅผ ์ ๋ ฅํด์ฃผ๋ฉด ๋๋ค. ํ์ง๋ง ํ์ ๋๋ ํ ๋ฆฌ๋ก ๋ง์ด ๋ด๋ ค๊ฐ๊ฑฐ๋, ํ์ผ ์ด๋ฆ ์์ฒด๊ฐ ๊ธธ ๊ฒฝ์ฐ ์ฝ๋๊ฐ ๊ธธ์ด์ง ์ ์๋ค๋ ๋จ์ ์ด ์๋ค.
from package1 import module1 # ํจํค์ง1์ ๋ชจ๋1์ ๊ฐ์ ธ์ค์
from package1.module2 import function1 #ํจํค์ง1์ ๋ชจ๋2์ ํจ์1์
from package2.subpackage1.module5 import function2 #ํจํค์ง2 ๋ด ํจํค์ง1์ ๋ชจ๋5์์ ํจ์2๋ฅผ ๊ฐ์ ธ์ค์
๋ฐ๋ฉด ์๋๊ฒฝ๋ก๋ ํ์ฌ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์์, ํ์๋ฅผ ์์ง์ด๊ธฐ ๋๋ฌธ์ ๋ณด๋ค ์งง์ ์ฝ๋๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ์ง๋ง, ๊ฒฝ๋ก ์ ์๊ฐ ๋ค์ ํท๊ฐ๋ฆด ์ ์๊ณ ํ์ผ์ด ์์นํ ๊ฒฝ๋ก๊ฐ ๋ฐ๋ ๊ฒฝ์ฐ ์ฌ์ ์ํด์ผ ํ๋ค๋ ๋จ์ ์ด ์๋ค.
# package2/module3.py
from . import class1 #ํจํค์ง2์ ๋ชจ๋3์์ ํด๋์ค1์ ๊ฐ์ ธ์ค์
from .subpackage1.module5 import function2
# ํจํค์ง2 ๋ด ์๋ธํจํค์ง1์ ๋ชจ๋5์์ ํจ์2๋ฅผ ๊ฐ์ ธ์ค์
# subpackage1/module5.py
from ..module4 import class4
# ํจํค์ง2์ ๋ชจ๋4์์ ํด๋์ค4๋ฅผ ๊ฐ์ ธ์ค์(subpackage์ ์์ ๋๋ ํ ๋ฆฌ์ธ ํจํค์ง2๋ก ์ ์ํ ๊ฒ)
๊ทธ๋์ ์ผ๋ฐ์ ์ธ ์ํฉ์์๋ ์ ๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ ๊ฒ
์ด ๊ถ์ฅ๋๋ค ๐
์ฝ๋๋ฅผ ์คํํ ๋ ์์ธ ์ํฉ์ด ๋ฐ์ํ๋ ๊ฒ์ exception์ด๋ผ๊ณ ํ๋ค. ์๋ฒฝํ ์ฝ๋๋ฅผ ์ง๋ ๊ฒ์ด ํ์ค์ ์ผ๋ก ํญ์ ๊ฐ๋ฅํ ๊ฒ์ด ์๋๊ณ , ํนํ ์ ์ ์ input์ ๊ธฐ๋ฐ์ผ๋ก ์ฐ์ฐ์ ํ๊ฒ ๋ ๋๋ ์ด๋ค data type์ ๋ฃ์์ง ์ ์ ์๊ธฐ ๋๋ฌธ์ exception์ด ๋ฐ์ํ ํ๋ฅ ์ด ๋๋ค.
exception์ด ๋ฐ์ํ๋ฉด ํด๋น ์ฝ๋ ์์น์์ ๋ค์ ์ฝ๋๊ฐ ์คํ๋์ง ์๊ณ ํ๋ก๊ทธ๋จ์ด ์ข
๋ฃ๋๋ค. ์ข
๋ฃ๋์ง ์๊ณ ๋ค๋ฅธ ๋ก์ง์ ์คํํ๊ฒ ํ๊ธฐ ์ํด exception handling
์ ํ๋ค.
def return_elem_or_minus_one(index):
short_list = [1, 2, 3]
elem = 0
try:
elem = short_list[index]
print("์ด ๋ฌธ์ฅ์ exception์ด ๋ฐ์ํ์ง ์์ผ๋ฉด ์คํ๋ฉ๋๋ค")
except IndexError: # ํน์ exception์ catchํ ์๋ ์๊ณ
print(f"์ด ๋ฌธ์ฅ์ Exception์ด ๋ฐ์ํ๋ฉด ์คํ ๋ฉ๋๋ค")
elem = -1
except Exception as e: # ๋ชจ๋ exception์ ๋ฐ์, exception์ ๊ฐ์ฒด๋ฅผ ๋ฐ์ ์ ๋ณด๋ฅผ ๋ ์ป์ ์๋ ์๋ค.
print(f"IndexError๊ฐ ์๋ ๋ค๋ฅธ ์ข
๋ฅ์ Exception์ด ๋ฐ์ํ์ต๋๋ค ==> {e}")
elem = -1
else: # ์์ธ๊ฐ ๋ฐ์ํ์ง ์์์ ๋
print(f"Exception์ด ๋ฐ์ํ์ง ์์์ต๋๋ค!")
finally:
print("์ด ๋ฌธ์ฅ์ exception ๋ฐ์ ์ฌ๋ถ์ ์๊ด์์ด ๋ฌด์กฐ๊ฑด ์คํ๋ฉ๋๋ค!")
return elem