⚙️
중급 (Intermediate)
import · __name__ · __init__.py · pip
3주차 — 모듈과 패키지
자체 모듈 만들고 import, __name__ == "__main__" 패턴, 폴더를 패키지로 만드는 __init__.py, 그리고 pip 으로 외부 패키지 설치까지 익힙니다.
modulepackageimportpip
소요 시간
⏱ 2시간
난이도
📊 중급
선수 조건
🎯 2주차
결과물
여러 파일/폴더로 분리된 작은 패키지 작성
이 강의에서 배우는 것
- 1자체 모듈을 만들고 import한다
- 2__name__ == "__main__" 패턴을 안다
- 3패키지 구조와 __init__.py 의 역할을 이해한다
- 4pip 으로 외부 패키지를 설치한다
1. 모듈
.py 파일이 곧 모듈. import로 다른 파일에서 사용.
python
# calc.py
def add(a, b):
return a + b
def sub(a, b):
return a - bpython
# main.py
import calc
print(calc.add(3, 5))
from calc import add, sub
print(add(1, 2), sub(5, 3))
from calc import add as plus
print(plus(10, 20))2. __name__ == "__main__"
스크립트로 직접 실행될 때만 동작하는 코드.
python
# mymod.py
def main():
print("실행됨")
if __name__ == "__main__":
main()이 패턴 덕분에 import mymod 해도 main() 이 자동 실행되지 않음.
3. 패키지
폴더에 여러 모듈을 묶은 것. __init__.py 가 있어야 패키지로 인식 (Python 3.3+ 부터 없어도 됨).
text
mypkg/
├── __init__.py
├── math_utils.py
└── string_utils.pypython
from mypkg.math_utils import add
from mypkg.string_utils import slugify4. __init__.py 활용
python
# mypkg/__init__.py
from .math_utils import add, sub
from .string_utils import slugify이렇게 하면 from mypkg import add 가능 (간편).
5. pip 으로 외부 패키지 설치
bash
pip install requests
pip install requests==2.31.0 # 특정 버전
pip install -r requirements.txt # 일괄 설치
pip list # 설치된 목록6. 자주 하는 실수
- 순환 import — A가 B를, B가 A를 import → ImportError
- 상대 import 잘못 — 패키지 내부에서는 from .module import ...
- 모듈 이름이 표준 라이브러리와 충돌 — random.py 라는 파일을 만들면 표준 random이 가려짐
7. FAQ
Q1. import 와 from 중 뭘 쓰나요?
사용하는 함수가 1-2개면 from, 많거나 모듈 이름을 명시하고 싶으면 import.
Q2. pip 가 안 깔려있어요
python -m ensurepip 또는 python -m pip --version 으로 확인.
Q3. 가상환경(venv)은 왜 쓰나요?
프로젝트마다 라이브러리 버전을 분리. 다음 학기·실무에서 거의 필수.
💻 예제 (examples)
실제로 실행해 결과를 확인할 수 있는 예제 코드입니다.
calc.py + main.py— 자체 모듈 import
CODE
# calc.py
def add(a, b): return a + b
def sub(a, b): return a - b
# main.py
import calc
from calc import add, sub
print(calc.add(3, 5))
print(add(10, 20), sub(5, 3))
▶ 실행 결과
8
30 2main_guard.py— __name__ == "__main__" 패턴
CODE
def greet(name):
return f"안녕, {name}!"
def main():
print(greet("홍길동"))
if __name__ == "__main__":
main()
▶ 실행 결과
안녕, 홍길동!use_pkg.py— 패키지 사용
CODE
# mypkg/__init__.py 에서 from .math_utils import add 한 경우
from mypkg import add
from mypkg.string_utils import slugify
print(add(2, 3))
print(slugify("Hello World!"))
▶ 실행 결과
5
hello-worlduse_external.py— 외부 패키지 (requests)
CODE
# pip install requests 후
import requests
r = requests.get("https://httpbin.org/json")
print(r.status_code)
print(r.json()["slideshow"]["title"])
▶ 실행 결과
200
Sample Slide Show📝 과제 (exercises)
직접 풀어보고, 막힐 때 정답을 펼쳐 비교해보세요.
과제 1
calculator/ 패키지
목표: basic + advanced 두 모듈로 나눈 calculator 패키지 만들기.
요구사항
- calculator/__init__.py — basic·advanced 함수 import 하여 패키지 레벨에서 노출
- calculator/basic.py — add, sub, mul, div
- calculator/advanced.py — power, sqrt, factorial
입출력 예시
8
1024
120▶정답 코드 펼치기 / 접기
SOLUTION
# calculator/basic.py
def add(a, b): return a + b
def sub(a, b): return a - b
def mul(a, b): return a * b
def div(a, b): return a / b if b else None
# calculator/advanced.py
def power(a, b): return a ** b
def sqrt(x): return x ** 0.5
def factorial(n): return 1 if n <= 1 else n * factorial(n - 1)
# calculator/__init__.py
from .basic import add, sub, mul, div
from .advanced import power, sqrt, factorial
# 사용
from calculator import add, power, factorial
print(add(3, 5))
print(power(2, 10))
print(factorial(5))
▶ 실행 결과
8
1024
120과제 2
string_utils.py — slugify, truncate
목표: 두 가지 문자열 유틸 함수가 있는 모듈을 만든다.
요구사항
- slugify(s): 공백 → -, 소문자, 비영숫자 제거
- truncate(s, n): n 글자로 자르고 "…" 추가
입출력 예시
hello-world
긴 문장입니다…▶정답 코드 펼치기 / 접기
SOLUTION
# string_utils.py
import re
def slugify(s):
s = s.lower()
s = re.sub(r"[^a-z0-9가-힣\s-]", "", s)
return re.sub(r"\s+", "-", s).strip("-")
def truncate(s, n):
return s if len(s) <= n else s[:n] + "…"
# 사용
print(slugify("Hello World!"))
print(truncate("긴 문장입니다 정말로", 7))
▶ 실행 결과
hello-world
긴 문장입니다…과제 3
__name__ == "__main__" 활용
목표: import 시에는 동작 안 하고, 직접 실행 시에만 데모를 보여주는 모듈.
요구사항
- 함수 1개 정의 (자유)
- if __name__ == "__main__": 안에서 데모 호출
- import 했을 때 데모가 실행되지 않는지 확인
입출력 예시
[직접 실행] greet 데모: 안녕, 홍길동!
[import 실행] (조용함)▶정답 코드 펼치기 / 접기
SOLUTION
# greet.py
def greet(name):
return f"안녕, {name}!"
if __name__ == "__main__":
print("[데모]", greet("홍길동"))
# other.py
import greet # 모듈 import — 데모는 실행되지 않음
print(greet.greet("김영희"))
▶ 실행 결과
# greet.py 직접 실행 시
[데모] 안녕, 홍길동!
# other.py 실행 시
안녕, 김영희!