PYTHON · 심층 가이드
Python Hello World 완전 정리
print() 한 줄에서 출발해 __main__ 진입점, venv 격리, pip 의존성 고정, src 레이아웃까지 실제로 배포 가능한 Python 프로젝트 뼈대를 완성합니다.
Python은 컴파일도, 진입점 선언도 요구하지 않습니다. 파일을 인터프리터에 넘기면 최상위 코드가 위에서 아래로 그대로 실행됩니다. 여기서 초심자의 모델이 처음 깨집니다. 같은 파일이 import 대상이 되는 순간에도 최상위 코드는 똑같이 실행되기 때문입니다. 즉 Python에는 "실행 파일"과 "라이브러리 파일"의 구분이 없고, 오직 __name__이라는 런타임 값이 그 둘을 나눕니다. Hello World가 한 줄인 이유와 진입점 관용구가 필요한 이유는 사실 같은 사실의 앞뒷면입니다.
순서대로 따라가면 자연스럽게 이어집니다. Hello World 출력로 인터프리터 실행 경로를 확인하고, __main__ 진입점 패턴에서 방금 만든 스크립트를 모듈로도 재사용 가능하게 바꿉니다. 다음으로 가상환경 설정이 그 스크립트가 살 방을 만들고, pip 패키지 관리가 그 방에 들여놓을 짐 목록을 requirements.txt로 문서화합니다. 마지막 프로젝트 구조는 앞의 네 조각을 한 디렉터리 규약으로 묶는 단계입니다.
가장 자주 사람을 잡는 건 이름 충돌입니다. 연습용으로 random.py나 json.py 같은 파일을 만들면 표준 라이브러리 대신 자기 파일이 먼저 임포트되어 이해할 수 없는 에러가 납니다. 옆에 생긴 __pycache__까지 지워야 완전히 사라집니다. 또 하나, 가상환경을 만들었다고 끝이 아니라 활성화한 셸에서 설치해야 합니다. 확신이 안 서면 python -m pip install 형태로 실행해 지금 쓰는 인터프리터와 pip를 강제로 일치시키는 습관이 안전합니다.
01Hello World 출력
Python에서 가장 첫 번째로 배우는 Hello World. 별도의 main 함수나 클래스 없이 한 줄로 실행됩니다.
Python code
# 가장 기본적인 출력
print("Hello, World!")
# 여러 값 출력
print("언어:", "Python", "버전:", 3.12)
# sep, end 파라미터
print("a", "b", "c", sep="-") # a-b-c
print("줄바꿈 없이", end=" ")
print("이어서 출력")
# f-string 출력 (Python 3.6+)
name = "Python"
version = 3.12
print(f"Hello, {name} {version}!")
# f-string 디버깅 (Python 3.8+)
x = 42
print(f"{x = }") # x = 42print(f"{x = }") 문법은 Python 3.8+에서 변수명과 값을 함께 출력하는 디버깅 단축키입니다.
Python 2의 print "hello"는 Python 3에서 동작하지 않습니다. 반드시 괄호를 사용하세요: print("hello")
02__main__ 진입점 패턴
Python 스크립트를 모듈로도, 직접 실행도 가능하게 만드는 관용구.
Python code
# calculator.py
def add(a, b):
return a + b
def subtract(a, b):
return a - b
# 이 파일을 직접 실행할 때만 동작
# import calculator 로 불러올 때는 건너뜀
if __name__ == "__main__":
print(add(3, 4)) # 7
print(subtract(10, 3)) # 7
# 실행 방법:
# python calculator.py → if 블록 실행됨
# python -c "import calculator; print(calculator.add(1,2))"
# → if 블록 건너뜀__name__은 현재 모듈의 이름입니다. 직접 실행 시 "__main__", import 시 모듈 이름("calculator")이 됩니다.
테스트 코드나 초기화 코드를 if __name__ == "__main__": 밖에 두면 import 시에도 실행되어 부작용이 생깁니다.
03가상환경 설정
Python 프로젝트마다 독립된 패키지 환경을 만드는 venv 모듈 사용법입니다. 시스템 Python을 오염시키지 않고 프로젝트별 의존성을 관리할 수 있습니다.
Python code
import subprocess, sys, os
# 가상환경 생성
# python -m venv .venv
# 활성화 (Linux/Mac)
# source .venv/bin/activate
# 활성화 (Windows)
# .venv\Scripts\activate
# 현재 가상환경 확인
print("Python 경로:", sys.executable)
print("가상환경 여부:", hasattr(sys, 'real_prefix')
or (hasattr(sys, 'base_prefix')
and sys.base_prefix != sys.prefix))
# 비활성화
# deactivatepython -m venv .venv으로 생성 후 .gitignore에 .venv/를 추가하세요.
가상환경 없이 pip install하면 시스템 Python에 패키지가 설치되어 다른 프로젝트와 버전 충돌이 발생합니다.
04pip 패키지 관리
Python의 패키지 관리자 pip를 사용하여 외부 라이브러리를 설치하고 requirements.txt로 의존성을 관리합니다.
Python code
import subprocess, sys
# 패키지 설치 / 업그레이드 / 삭제
# pip install requests
# pip install requests==2.31.0
# pip install --upgrade requests
# pip uninstall requests
# 설치된 패키지 목록
# pip list
# pip freeze > requirements.txt
# requirements.txt에서 일괄 설치
# pip install -r requirements.txt
# 프로그래밍 방식으로 설치된 패키지 확인
from importlib.metadata import distributions
installed = {d.metadata["Name"]: d.version
for d in distributions()}
for name in sorted(installed)[:5]:
print(f"{name}=={installed[name]}")pip freeze 대신 pip-compile(pip-tools)을 쓰면 직접 의존성과 간접 의존성을 분리 관리할 수 있습니다.
pip install 시 버전을 고정하지 않으면 환경마다 다른 버전이 설치되어 "내 컴퓨터에서는 되는데" 문제가 발생합니다.
05프로젝트 구조
Python 프로젝트의 표준 디렉터리 구조를 이해하면 유지보수와 배포가 쉬워집니다. src/ 레이아웃이 현대적 표준입니다.
Python code
# 권장 프로젝트 구조
project_structure = """
my-project/
├── src/
│ └── my_package/
│ ├── __init__.py
│ ├── core.py
│ └── utils.py
├── tests/
│ ├── __init__.py
│ ├── test_core.py
│ └── test_utils.py
├── docs/
├── pyproject.toml
├── README.md
└── .gitignore
"""
print(project_structure)
# __init__.py로 패키지 정의
# src/my_package/__init__.py
__version__ = "0.1.0"
__all__ = ["core", "utils"]src/ 레이아웃은 개발 중 설치되지 않은 패키지를 실수로 import하는 것을 방지합니다.
__init__.py를 빠뜨리면 Python이 해당 디렉터리를 패키지로 인식하지 못합니다 (namespace 패키지 제외).
정리하며
- 스크립트와 모듈을 가르는 건 파일 확장자가 아니라 런타임의
__name__값입니다. - 패키지 설치는 항상
python -m pip로 실행해 인터프리터와 pip의 짝을 고정합니다. - 연습 파일 이름을 표준 모듈명과 겹치게 짓지 말고, 충돌 시
__pycache__도 함께 지웁니다. - 프로젝트마다 venv를 새로 만들고
requirements.txt로 의존성을 기록해 재현 가능하게 둡니다.
더 깊이 들어가고 싶다면 Python 학습 라이브러리에서 다른 주제 가이드를 이어서 보거나, 언어 비교에서 같은 개념이 다른 언어에서 어떻게 표현되는지 확인해 보세요.