pip install -e .를 처음 마주치면 이런 생각이 듭니다.
-e를 붙이지?”*.egg-info/는 뭐지? 왜 갑자기 생겼지?”pyproject.toml의 name이랑 import는 같은 거 아냐?”나도 처음에 여기서 한번씩 멈췄는데, 딱 헷갈리는 포인트만 정리해본다.
pip install -e .는 현재 디렉터리(.)의 프로젝트를 editable(편집 가능) 모드로 설치해서, 코드를 수정해도 재설치 없이 바로 import 결과에 반영되게 해주는 개발용 설치 방식이다.
pip install .는 현재 디렉터리의 프로젝트를 일반 설치(non-editable) 하는 명령이라, 설치 이후에 로컬 소스를 수정해도 변경이 즉시 반영되지 않을 수 있다.
pip install -e .가 실제로 하는 일pip install .)와 차이일반 설치(pip install .)
site-packages 아래에 설치된다.editable 설치(pip install -e .)
-e는 개발할 때 “수정 → 재설치” 루프를 없애는 옵션입니다.개발용 의존성까지 같이 설치하려면 pyproject.toml의 **[project.optional-dependencies]**에 정의된 그룹 이름(extras) 을 선택해서 설치하며 대괄호 안에 해당 이름을 넣어 주면 된다
pip install -e ".[dev]".[dev]의 의미: 현재 프로젝트(.) + dev extra(개발용 추가 의존성: pytest/ruff/black 등) 를 함께 설치[]를 안전하게 처리하려고 붙이는 습관이며 붙이는 걸 권장import를 “설치된 패키지처럼” 쓰고 싶을 때pip install .을 반복하고 싶지 않을 때pip install .(또는 pip install -e .)을 치면 pip은 현재 폴더(.) 를 “파이썬 프로젝트”로 보고, 아래 중 하나를 찾는다.
pyproject.toml: 요즘 표준. 있으면 이걸 기준으로 빌드/설치를 진행한다.setup.py: 예전 방식(레거시). pyproject.toml이 없을 때 이걸 보고 설치한다.pyproject.toml에서 include = ["app*"]로 잡혀 있어서 app/이 설치 대상으로 들어간다.
그래서 설치 후에는 보통 from app... 형태로 import 하게 된다.
*.egg-info/는 뭐고 왜 생기나?.egg-info 폴더는 파이썬 패키징 도구가 생성하는 메타데이터(설치 정보) 입니다.
pip은 이 프로젝트가 어떤 패키지인지(이름/버전/의존성)를 알아야 설치와 의존성 해결을 할 수 있으며,
그 정보를 기록하기 위해 egg-info(또는 경우에 따라 dist-info)가 생성됩니다.
보통 .gitignore에 추가 하여 관리 한다.
프로젝트마다 100% 똑같진 않지만, *.egg-info/ 안에는 보통 이런 파일들이 들어간다. (내가 실제로 많이 본 것들 기준)
PKG-INFO
requires.txt
pyproject.toml의 dependencies나 extras 내용이 설치 도구에 의해 여기로 정리되는 느낌이라고 보면 된다.SOURCES.txt
top_level.txt
app 같은 최상위 패키지명이 여기 적혀 있을 수 있다.dependency_links.txt (가끔 비어있기도 함)
중요한 건, 이 폴더는 “내 앱 코드”가 아니라 설치/패키징을 위한 기록물이라서 보통 직접 손댈 일이 거의 없다.
여기서 많이 헷갈리는데, 결론부터 말하면 이 둘은 역할이 다르다.
pip install ... 할 때 쓰는 이름import ... 할 때 쓰는 이름(폴더/파일 이름)pyproject.toml의 name이 배포 이름이다.
[project]
name = "python_backend"# 이 이름은 주로 패키지 명에 사용 된다
pip install python_backend
pip uninstall python_backend
pip list
pip show python_backendimport는 파이썬이 찾는 모듈/패키지 이름(폴더/파일 이름) 을 쓴다.
최상위 패키지가 app/이면 import는 보통 이렇게 한다.
from app.main import app배포 이름과 import의 차이 떄문에 보통 name과 import할 최상위 패키지 폴더명을 일치시킵니다.
pip install -e .는 개발 편의를 위해 내 작업 폴더를 “설치된 것처럼” 연결해줍니다.*.egg-info/는 그 과정에서 만들어지는 설치 메타데이터입니다.pyproject.toml의 name은 배포 이름, import는 패키지 폴더 이름입니다.