๐Ÿ ๋ชจ๋“ˆ๊ณผ ํŒจํ‚ค์ง€

ํŒ”๋ฆฌ๋™ยท2021๋…„ 8์›” 5์ผ
1

ํŒŒ์ด์ฌ ๋ชจ๋“ˆ๊ณผ ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

sys.modules & sys.path

sys.modules

์šฐ์„  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

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'
]

ํŒŒ์ด์ฌ์ด ๋ชจ๋“ˆ/package๋ฅผ ์ฐพ๋Š” ์ˆœ์„œ

    1. sys.modules
    1. built-in modules
    1. sys.path

๊ทธ๋ ‡๋‹ค๋ฉด sys๋Š” ์–ด๋””์„œ ์ฐพ์•„์˜ฌ๊นŒ?

sys ๋ชจ๋“ˆ์€ ํŒŒ์ด์ฌ์— ๋‚ด์žฅ๋œ ๋ชจ๋“ˆ์ด๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ด์ฌ์€ ์ด ๋ชจ๋“ˆ์„ ์–ด๋””์—์„œ ์ฐพ์•„์•ผ ํ• ์ง€ ์•Œ๊ณ  ์žˆ๋‹ค.

์‘~ ์ฆ๋ช…ํ•ด

์•„๊นŒ (sys.modules)๋ฅผ ํ”„๋ฆฐํŠธ ์ฐ์–ด๋ณด๋ฉด sys๊ฐ€ built-in์ธ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

Absolute path์™€ relative path

Absolute path

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

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__

  • ๋ชจ๋“ˆ์„ ์ž„ํฌํŠธํ•  ๋•Œ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ์ ์„ ์•Œ์•„๋ณด์ž


์œ„์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ํŒจํ‚ค์ง€๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž

๊ฐ์ž ์ฝ”๋“œ๋Š”

  • main.py
# 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))
  • add_and_multiply.py
from .multiplication import multiply
# from calculator.multiplication import multiply
 
def add_and_multiply(a,b):
    return multiply(a,b) + (a+b)
  • multiplication.py
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๋ ๋•Œ ๊ผญ ๋จผ์ € ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ๋“ค

profile
๋ฐฐ์›€์˜ ๊ธฐ๋ก

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