Monday_June_29
.
.
.

1๏ธโƒฃ sys.modules์™€ sys.path์˜ ์ฐจ์ด์ 

๐Ÿ‘‰ ํŒŒ์ด์ฌ์€ ํ•ด๋‹น ๋ชจ๋“ˆ์ด๋‚˜ ํŒจํ‚ค์ง€๋ฅผ ์ฐพ์„ ๋•Œ, 3๊ณณ์˜ ์žฅ์†Œ๋ฅผ ๋’ค์ ธ๋ณด๋ฉฐ ๋ชจ๋“ˆ๊ณผ ํŒจํ‚ค์ง€๋ฅผ ์ฐพ๋Š”๋‹ค.
๊ทธ 3๊ณณ์˜ ์žฅ์†Œ๊ฐ€ sys.modules์™€ built-in modules, ๊ทธ๋ฆฌ๊ณ  sys.path์ธ ๊ฒƒ์ด๋‹ค.
๊ทธ๋ฆฌ๊ณ  ํŒŒ์ด์ฌ์€ ์ด 3๊ณณ์„ ๋‚˜์—ดํ•œ ์ˆœ์œผ๋กœ ๋Œ์•„๋‹ค๋‹ˆ๋ฉฐ ์ฐพ๋Š” ๊ฒƒ์ด๋‹ค.

sys.modules

ํŒŒ์ด์ฌ์ด ํ•ด๋‹น ๋ชจ๋“ˆ์ด๋‚˜ ํŒจํ‚ค์ง€๋ฅผ ์ฐพ์„ ๋•Œ, sys.modules ๋ผ๋Š” ์žฅ์†Œ๋ฅผ ๋จผ์ € ์ฐพ์•„๋ณธ๋‹ค.
(๊ทธ ๋‹ค์Œ์œผ๋กœ ์ฐพ์•„๋ณด๋Š” ์žฅ์†Œ๋Š” built-in modules๋ผ๋Š” ๊ณณ์ด๋‹ค.)

sys.modules๋Š” ๋‹จ์ˆœํ•œ dictionary ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฏธ
import๋œ ๋ชจ๋“ˆ/ํŒจํ‚ค์ง€๋“ค์„ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค.

๋‹ค์‹œ ๋งํ•ด, ์ด๋ฏธ import๋œ ๋ชจ๋“ˆ๊ณผ package๋“ค์€ ํŒŒ์ด์ฌ์ด ๋˜ ๋‹ค์‹œ ์ฐพ์ง€ ์•Š์•„๋„ ๋˜๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
(์•„์ง importํ•˜์ง€ ์•Š์€ ๋ชจ๋“ˆ/ํŒจํ‚ค์ง€๋Š” sys.modules์—์„œ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค.)

built-in modules

1 - ํŒŒ์ด์ฌ์ด ์ œ๊ณตํ•˜๋Š” ๊ณต์‹ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด๋‹ค.
2 - built-in modules์€ ์ด๋ฏธ ํŒŒ์ด์ฌ์—์„œ ํฌํ•จ๋˜์–ด ๋‚˜์˜จ๋‹ค.
3 - So, ํŒŒ์ด์ฌ์ด ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

sys.path

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ์ด sys.path ๋ผ๋Š” ๊ณณ์„ ์ฐพ๋Š”๋‹ค.

sys.modules๋Š” ๋”•์…”๋„ˆ๋ฆฌ์˜€์ง€๋งŒ, sys.path๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ 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ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ชจ๋“ˆ/ํŒจํ‚ค์ง€๋“ค์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
(๋งŒ์•ฝ ๋งˆ์ง€๋ง‰ ์ฒดํฌ ์žฅ์†Œ์ธ sys.path๊นŒ์ง€ importํ•˜๊ณ ์ž ํ•˜๋Š” ๋ชจ๋“ˆ/ํŒจํ‚ค์ง€๊ฐ€ ์—†๋‹ค๋ฉด, ModuleNotFoundError ์—๋Ÿฌ๊ฐ€ ๋œฌ๋‹ค.)

2๏ธโƒฃ sys๋„ import ํ•ด์•ผํ•˜๋Š” ๋ชจ๋“ˆ์ธ๋ฐ ํŒŒ์ด์ฌ์€ sys๋ชจ๋“ˆ์˜ ์œ„์น˜๋ฅผ ์–ด๋–ป๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์„๊นŒ?

sys๋Š” ํŒŒ์ด์ฌ์— ํฌํ•จ๋˜์–ด์žˆ๋Š” ๋ชจ๋“ˆ์ด๋‹ค.(๋ฌด์Šจ ๋œป์ด๋ƒ?)
ํŒŒ์ด์ฌ์—์„œ ๊ณต์‹์ ์œผ๋กœ ์ œ๊ณตํ•˜๊ณ  ์ด๋ฏธ ํŒŒ์ด์ฌ์—์„œ ํฌํ•จ๋œ๋‹ค๋Š” ๋ง
์ฆ‰, built-in modules์— ์žˆ๊ธฐ์—, sys.modules๋ฅผ ๋จผ์ € ์ฐพ๊ณ  ์—†์œผ๋‹ˆ
2๋ฒˆ์งธ ์ฒดํฌ ์žฅ์†Œ์ธ built-in modules๋ฅผ ์ฒดํฌํ•˜๋‹ค๊ฐ€ ๋ฐœ๊ฒฌํ•˜๊ณ  import๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

3๏ธโƒฃ Absolute path์™€ relative path์˜ ์ฐจ์ด์ 

Absolute path(์ ˆ๋Œ€ ๊ฒฝ๋กœ)

import๋ฅผ ํ•˜๋Š” ํŒŒ์ผ/ํŒจํ‚ค์ง€๊ฐ€ ๊ฒฝ๋กœ์— ์ƒ๊ด€์—†์ด ํ•ญ์ƒ ๊ฒฝ๋กœ๊ฐ€ ๊ฐ™๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„์ฝ”๋“œ์— ์ƒ๋‹ด์„ ์‹ ์ฒญํ•˜๋ ค๊ณ  ์œ„์›Œํฌ๋กœ ๊ฐ€๋ ค๊ณ ํ•œ๋‹ค.
๊ทธ ๋ˆ„๊ฐ€ ์–ด๋””์— ์‚ด๋“ ์ง€ ์œ„์›Œํฌ๋กœ ์˜ค๋ ค๋ฉด ์„œ์šธ์‹œ ๊ฐ•๋‚จ๊ตฌ ํ…Œํ—ค๋ž€๋กœ 427 ์œ„์›Œํฌ ํƒ€์›Œ(์œ„์›Œํฌ ์„ ๋ฆ‰ 2ํ˜ธ์ ) ์œผ๋กœ ์™€์•ผํ•œ๋‹ค.

Relative path(์ƒ๋Œ€ ๊ฒฝ๋กœ)

์ƒ๋Œ€ ๊ฒฝ๋กœ๋Š” ์ ˆ๋Œ€ ๊ฒฝ๋กœ์™€ ๋‹ค๋ฅด๊ฒŒ importํ•˜๋Š” ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒฝ๋กœ๋ฅผ ์ •์˜ํ•œ๋‹ค. (๋‚ด ์œ„์น˜๊ฐ€ ์ค‘์š”ํ•˜๋‹ค๋Š” ๋œป)

์˜ˆ๋ฅผ ๋“ค์–ด, ์˜†์ง‘์— ์‚ฌ๋Š” ์‚ฌ๋žŒ์€ ์œ„์›Œํฌ์— ์˜ฌ ๋•Œ ์ง‘์„ ๋‚˜์™€ ์˜† ๊ฑด๋ฌผ์ธ ์œ„์›Œํฌ๋กœ ์˜ค๋ฉด ๋œ๋‹ค.
์•ž์ง‘์— ์‚ฌ๋Š” ์‚ฌ๋žŒ์€ ๊ธธ๋งŒ ๊ฑด๋„ˆ๋ฉด ๋œ๋‹ค. ๋ฉ€๋ฆฌ ์‚ฌ๋Š” ์‚ฌ๋žŒ์€ ์ฐจ๋ฅผ ํƒ€๊ณ  ์™€์•ผํ•˜๊ณ , ํ•ด์™ธ์— ์‚ฌ๋Š” ์‚ฌ๋žŒ์€ ๋น„ํ–‰๊ธฐ๋ฅผ ํƒ€๊ณ  ์™€์„œ ์ฐจ๋ฅผ ํƒ€๊ณ  ์™€์•ผํ•œ๋‹ค.

๋น„์œ ๊ฐ€ ์ด์ƒํ–ˆ์„ ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ์ ˆ๋Œ€ ๊ฒฝ๋กœ์™€ ์ƒ๋Œ€ ๊ฒฝ๋กœ์˜ ์ฐจ์ด๋Š” ๊ธฐ์ค€์ด ๋‹ค๋ฅธ ๊ฒƒ์ด๋‹ค.

my_app
โ”œโ”€โ”€ main.py
โ”œโ”€โ”€ pkg1
โ”‚   โ”œโ”€โ”€ __init__.py
โ”‚   โ”œโ”€โ”€ module1.py
โ”‚   โ””โ”€โ”€ module2.py
โ”œโ”€โ”€ pkg2
โ”‚   โ”œโ”€โ”€ __init__.py
โ”‚   โ”œโ”€โ”€ module3.py
โ”‚   โ”œโ”€โ”€ module4.py
โ”‚   โ”œโ”€โ”€ module5.py
โ”‚   โ””โ”€โ”€ pkg4
โ”‚       โ”œโ”€โ”€ __init__.py
โ”‚       โ””โ”€โ”€ module6.py
โ””โ”€โ”€ pkg3
    โ”œโ”€โ”€ __init__.py
    โ””โ”€โ”€ module7.py

๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ๋‹ค๊ณ  ๊ฐ€์ •์„ ํ•˜๊ณ , ๋งŒ์•ฝ ๋‚ด๊ฐ€ my_app์•ˆ์— ์žˆ๋Š” pkg2์˜ pkg4์˜ module6.py ํŒŒ์ผ์— ์žˆ๋Š” ์–ด๋– ํ•œ ์š”์†Œ๋ฅผ importํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‚ด๊ฐ€ ์–ด๋Š ์œ„์น˜์— ์žˆ๋˜์ง€ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๐Ÿ‘‰ Absolute path(์ ˆ๋Œ€ ๊ฒฝ๋กœ)

from pkg2.pkg4.module6 import any_var
from pkg2.pkg4.module6 import any_func()
from pkg2.pkg4.module6 import AnyClass

์ด๋ ‡๊ฒŒ ํ•ด๋„ ๋˜๊ณ , ๋งŒ์•ฝ importํ•  ๋ฌด์–ธ๊ฐ€๊ฐ€ ํ™•์‹คํ•˜์ง€ ์•Š๋‹ค๋ฉด from์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ณ  module6 ํŒŒ์ผ๋งŒ importํ•ด์ค˜์„œ ๋‚˜์ค‘์— ํ•„์š”ํ•œ ์š”์†Œ๋ฅผ module.๋ฌด์–ธ๊ฐ€ ๋ผ๋Š” ํ˜•์‹์œผ๋กœ ์จ์ฃผ๋ฉด ๋œ๋‹ค.

from pkg2.pkg4 import module6
>
my_var = module6.any_var
my_func = module6.any_func()
MyClass = module6.AnyClass

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ๊ฑด, ๋‚ด๊ฐ€ ์–ด๋””์— ์žˆ๋“ ์ง€, ์ตœ์ƒ์œ„(my_app)๋ฅผ ๊ธฐ์ค€์œผ๋กœ
๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿ‘‰ Relative path(์ƒ๋Œ€ ๊ฒฝ๋กœ)

์ƒ๋Œ€ ๊ฒฝ๋กœ๋Š” ๋‚˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒฝ๋กœ๋ฅผ ์žก๋Š”๋‹ค. ์œ„ ๊ฒฝ๋กœ๋ฅผ ์˜ˆ๋กœ, ๋‚ด๊ฐ€ ๋งŒ์•ฝ module6.py์— ์žˆ๋‹ค๊ณ  ์น˜๊ณ  module7.py๋กœ ๊ฐ€๊ณ ์‹ถ๋‹ค๋ฉด, ์œ„๋กœ ๋‘ ๋ฒˆ ์˜ฌ๋ผ๊ฐ€์„œ(pkg4 > pkg2) ๊ฐ™์€ ์ธต์— ์žˆ๋Š” pkg3๋กœ ๊ฐ€๊ณ  ํ•œ ๋ฒˆ ๋” ๋‚ด๋ ค๊ฐ€ module7.py ๋กœ ๊ฐ€๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๋งŒ์•ฝ module4.py์— ์žˆ๋Š”๋ฐ module6.py ํŒŒ์ผ์„ importํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

from .pkg4 import module6

.์€ ํ˜„์žฌ ์œ„์น˜๋ฅผ ๋œปํ•œ๋‹ค. ๋‹ค์‹œ ๋งํ•ด ํ˜„์žฌ ์œ„์น˜์—์„œ pkg4๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ณ  module6๋Š” pkg4 ์•ˆ์— ์žˆ์œผ๋‹ˆ ๋ฐ”๋กœ import๋ฅผ ํ•ด์ฃผ๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

profile
๐Ÿ‡ Rabbit can take a rest, but ๐Ÿข turtle can't

0๊ฐœ์˜ ๋Œ“๊ธ€