본문 바로가기
C.W.K.
Stream
Lesson 01 of 05 · published

import — Python이 모듈을 찾고 한 번만 실행하는 과정

~22 min · import, module, sys.path, package

Level 0호기심
0 XP0/93 lessons0/23 achievements
0/100 XP to next level100 XP to go0% complete

첫 import에서 Python은 sys.path를 순서대로 찾아 모듈을 읽고 최상위 코드를 실행한 뒤 sys.modules에 저장해. 같은 프로세스의 다음 import는 저장된 객체를 다시 묶을 뿐 본문을 되풀이하지 않아.

import x, import x.y, from x import y, 별칭 형태는 현재 이름 공간에 무엇을 묶는지가 달라. 절대 import는 전체 경로를, 점으로 시작하는 상대 import는 현재 패키지를 기준으로 해.

star import는 이름의 출처를 가리고 충돌을 만들기 쉬워 피해야 해. import 자체가 코드를 실행할 수 있으므로 보통 파일 위에 두고, 순환 의존이나 비싼 선택 기능처럼 이유가 있을 때만 늦춰.

Code

네 가지 import가 묶는 이름·python
# 형태 1 — 모듈 바인딩
import json
print(json.dumps({"a": 1}))

# 형태 2 — top-level 패키지 바인딩, 점으로 submodule 접근
import os.path
print(os.path.join("a", "b"))     # 'os' 가 바인딩

# 형태 3 — 모듈에서 이름 바인딩
from datetime import datetime
print(datetime.now())

# 형태 4 — import 시 rename
import numpy as np                # 매우 흔한 alias
import pandas as pd
sys.path에서 모듈 찾기·python
import sys
for p in sys.path:
    print(p)
# 일반 내용:
# 1. 스크립트 디렉토리 (또는 인터랙티브면 '')
# 2. PYTHONPATH 환경변수의 디렉토리
# 3. 표준 라이브러리 디렉토리
# 4. site-packages

# 로드된 모듈 위치 확인
import json
print(json.__file__)               # /path/to/lib/python3.x/json/__init__.py
한 번 실행하고 sys.modules에 저장하기·python
# /tmp/loud.py
# print("loud 모듈 로딩")
# value = 42

import sys
sys.path.insert(0, "/tmp")

import loud                       # 'loud 모듈 로딩' 한 번 출력
import loud                       # 아무것도 — sys.modules 에 이미 캐시
print(loud.value)                 # 42

# 강제 reload
import importlib
importlib.reload(loud)            # 'loud 모듈 로딩' 다시 출력
패키지 안의 상대 import·python
# 이런 패키지 구조 가정:
# mypackage/
#   __init__.py
#   core.py
#   utils.py
#   sub/
#     __init__.py
#     helper.py

# mypackage/utils.py 안
# from .core import important_thing       # 같은 레벨 — 같은 패키지
# from . import core                       # 같은 레벨 — 모듈 참조

# mypackage/sub/helper.py 안
# from ..core import important_thing       # 한 레벨 위
# from .. import utils                     # 부모 sibling

# 상대 import 는 패키지 안에서만 — top-level 모듈은 못 씀.

External links

Exercise

/tmp/quest_pkg에 패키지와 a.py, b.py, c.py를 만들고 b에서는 상대 import, c에서는 절대 import로 같은 x를 가져와. /tmp를 sys.path에 넣어 두 방식이 같은 값을 읽는지 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.