[210713 TIL] Python

Choi Rimยท2021๋…„ 7์›” 13์ผ
0

Python

๋ชฉ๋ก ๋ณด๊ธฐ
12/20
post-thumbnail

Module

  • ํŒŒ์ด์ฌ์—์„œ ๋ชจ๋“ˆ์€ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜ ๊ทธ๋ฆฌ๊ณ  ํด๋ž˜์Šค ๋“ฑ์„ ๋ชจ์•„๋†“์€ ํŒŒ์ผ์ด๋‹ค.
  • ๋”ฐ๋กœ ๋ชจ๋“ˆ๋กœ ๋ชจ์•„๋†“์€ ์ด์œ 
    • ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.
    • ์ „์ฒด ์ฝ”๋“œ๊ฐ€ ํ•œ ํŒŒ์ผ์— ๋„ฃ๊ธฐ์—๋Š” ๋„ˆ๋ฌด ์ปค์กŒ์„๋•Œ ์—ฌ๋Ÿฌ ํŒŒ์ผ๋กœ ๋‚˜๋ˆ„์–ด์„œ ์ •๋ฆฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ
  • ๋ชจ๋“ˆ์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ด๋ฏธ ๋งŒ๋“ค์–ด๋†“์€ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

Module ๋งŒ๋“ค๊ธฐ

## my_module.py
my_module_var = 7

def my_module_func():
    return "Hello!"

class MyModuleClass:
    pass
import my_module
  1. ์›ํ•˜๋Š” ๋ชจ๋“ˆ์„ import ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆ๋Ÿฌ์˜จ๋‹ค. ๊ทธ๋Ÿผ์œผ๋กœ ํŒŒ์ด์ฌ์ด ๋ชจ๋“ˆ์„ ํ•ด๋‹น ํŒŒ์ผ๊ณผ ์—ฐ๊ฒฐ์‹œํ‚ค๊ฒŒ ๋œ๋‹ค.
  2. ๊ทธ ํ›„ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“ˆ์—์„œ ์›ํ•˜๋Š” ๋ณ€์ˆ˜/ํ•จ์ˆ˜/ํด๋ž˜์Šค ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ๋‹ค๋งŒ ํ•ด๋‹น ๋ชจ๋“ˆ ์ด๋ฆ„๊ณผ ์—ฐ๊ฒฐํ•ด์„œ ํ˜ธ์ถœ์„ ํ•ด์ค˜์•ผ ํŒŒ์ด์ฌ์ด ์–ด๋Š ํŒŒ์ผ์—์„œ ํ•ด๋‹น ๋ณ€์ˆ˜/ํ•จ์ˆ˜/ํด๋ž˜์Šค ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค.

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 ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
# __init__.py
from .mod1 import func2
# main.py
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์— ์„ ์–ธํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
# __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 ๋  ์ˆ˜ ์—†์Œ.

๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ 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๊ฐ€์ง€ ์žฅ์†Œ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋ณด๋ฉด์„œ ์ฐพ์Šต๋‹ˆ๋‹ค.
      1. sys.modules
      2. built-in modules
      3. 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 ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋‹ค์Œ ์ฒ˜๋Ÿผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
# package2/module3.py

from . import class1
from .subpackage1.module5 import function2
  • ์—ฌ๊ธฐ์„œ dot .์€ import ๊ฐ€ ์„ ์–ธ๋˜๋Š” ํŒŒ์ผ์˜ ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ด์•ผ๊ธฐ ํ•œ๋‹ค.
  • ํ˜„์žฌ์œ„์น˜๋Š” package2/module3.py ์ด๋ฏ€๋กœ ํ˜„์žฌ ์œ„์น˜์—์„œ๋ถ€ํ„ฐ ์›ํ•˜๋Š” ๋ชจ๋“ˆ์˜ ๊ฒฝ๋กœ๋งŒ ์„ ์–ธํ•ด์ฃผ๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ๋˜ํ•œ dot 2๊ฐœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. dot 2๊ฐœ .. ๋Š” ํ˜„์žฌ์œ„์น˜์—์„œ ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ๋‹ค.
# subpackage1/module5.py
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

# 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))
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 ํŒŒ์ผ์˜ ์—ญํ• 

  • ํŒŒ์ผ ์•ˆ์— ์•„๋ฌด ์ฝ”๋“œ๋„ ์—†์ง€๋งŒ ํŒŒ์ผ์ด ์†ํ•ด์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ํŒจํ‚ค์ง€์ž„์„ ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

<์ฐธ๊ณ >

profile
https://rimi0108.github.io/

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