iBetter Books
수정

요즘 파이썬 프로젝트는 빠르고 가벼운 uv로 환경을 꾸리는 흐름이 대세입니다. 그런데도 이 책은 일부러 conda를 고릅니다. 이유는 단 하나, 얼굴 인식 실습의 길목을 가장 자주 막는 dlib 때문입니다. 이 장에서는 pip install dlib이 왜 그렇게 자주 실패하는지, uv로 바꿔도 왜 같은 벽에 부딪히는지, 그리고 conda는 그 벽을 어떻게 그냥 돌아가 버리는지를 차근차근 풀어 봅니다.

실습을 시작도 못 하게 막는 한 줄

얼굴 인식 입문서를 펼치면 거의 예외 없이 등장하는 명령이 있습니다.

pip install dlib

문제는 이 한 줄이 수많은 학습자의 컴퓨터에서 빨간 에러를 토해 낸다는 것입니다. 특히 윈도우에서 흔하게 마주치는 메시지는 대략 이렇게 생겼습니다.

Building wheel for dlib (pyproject.toml) ... error  error: subprocess-exited-with-error  CMake is not installed on your system!  ERROR: Failed building wheel for dlib

처음 이 화면을 본 학습자는 보통 이렇게 생각합니다. "내가 뭘 잘못 입력했나?" 아닙니다. 명령은 정확합니다. 문제는 dlib이라는 라이브러리의 태생에 있습니다.

dlib이 컴파일러를 요구하는 이유

우리가 pip install numpy처럼 평소 설치하는 대부분의 패키지는 휠(wheel)이라는 형태로 배포됩니다. 휠은 이미 빌드가 끝난 완제품입니다. 내려받아 자리에 놓기만 하면 바로 동작합니다.

그런데 dlib은 사정이 다릅니다. dlib의 핵심은 C++로 작성되어 있어서, 내 컴퓨터에서 쓰려면 그 C++ 코드를 내 운영체제에 맞게 컴파일(소스 코드를 실행 가능한 형태로 번역)해야 합니다. 만약 내 파이썬 버전이나 운영체제에 맞는 완제품 휠이 없으면, pip은 어쩔 수 없이 소스 코드를 내려받아 그 자리에서 직접 빌드를 시도합니다.

이 빌드에는 준비물이 필요합니다.

  • C++ 컴파일러
  • CMake라는 빌드 설정 도구
  • 윈도우라면 추가로 Visual Studio Build Tools

이 셋 중 하나라도 없으면 빌드는 그대로 멈추고, 위에서 본 에러가 납니다. 문제는 이 준비물들이 개발 환경을 따로 갖춘 사람이 아니면 보통 깔려 있지 않다는 점입니다. 결국 알고리즘은 구경도 못 한 채 컴파일러 설치부터 씨름하다 지치는 일이 벌어집니다.

uv로 바꿔도 벽은 그대로다

"그럼 더 빠르고 똑똑한 uv를 쓰면 되지 않나?"라는 질문이 자연스럽게 나옵니다. uv는 Rust로 만들어진 차세대 파이썬 패키지 도구로, pip보다 설치와 의존성 해결이 훨씬 빠릅니다. 좋은 도구입니다.

하지만 uv도 결국 같은 PyPI 저장소에서 패키지를 가져옵니다. 내 환경에 맞는 dlib 완제품 휠이 PyPI에 없다면, uv 역시 소스 코드를 내려받아 빌드를 시도합니다. 즉 uv는 "내려받고 푸는 속도"를 빠르게 해 줄 뿐, 컴파일러가 없어서 빌드가 실패하는 문제 자체는 해결해 주지 못합니다. 빌드 지옥의 입구는 도구를 바꿔도 그대로 남아 있는 셈입니다.

conda는 문제를 푸는 게 아니라 비껴간다

conda의 접근은 발상이 다릅니다. 빌드를 어떻게 성공시킬지 고민하는 대신, 애초에 빌드가 필요 없게 만듭니다.

conda는 PyPI가 아니라 채널(channel)이라는 별도의 패키지 저장소에서 패키지를 가져옵니다. 그중 conda-forge라는 채널에는 dlib을 비롯한 까다로운 라이브러리들이 운영체제별로 이미 컴파일된 완제품 형태로 올라가 있습니다. 그래서 다음 한 줄이면 끝납니다.

conda install -c conda-forge dlib

여기서 -c conda-forge는 "conda-forge 채널에서 가져와라"라는 뜻입니다. 컴파일러도, CMake도, Visual Studio Build Tools도 필요 없습니다. 누군가 이미 빌드해 둔 dlib을 내려받아 자리에 놓을 뿐이기 때문입니다.

두 길을 나란히 놓고 보면

항목 pip / uv conda (conda-forge)
패키지 출처 PyPI conda 채널(conda-forge 등)
dlib 완제품 제공 환경에 따라 없을 때가 많음 운영체제별로 제공
빌드 도구 필요 휠이 없으면 필요(컴파일러·CMake) 불필요
C·시스템 라이브러리 관리 파이썬 패키지만 다룸 파이썬 외 의존성까지 함께 관리
이 책에서의 역할 보조(일부 PyPI 전용 패키지) 기본 실습 환경

이 표의 마지막에서 둘째 줄이 conda를 고른 진짜 이유입니다. 얼굴 인식 라이브러리들은 OpenCV, dlib처럼 파이썬 바깥의 C·시스템 라이브러리에 기대는 경우가 많은데, conda는 이런 비(非)파이썬 의존성까지 한 묶음으로 관리해 줍니다. 그래서 "내 컴퓨터에서만 안 되는" 상황이 훨씬 줄어듭니다.

실무 팁. conda를 쓴다고 pip을 완전히 버리는 것은 아닙니다. conda 채널에 없는 일부 패키지는 conda 환경 안에서 pip으로 설치하게 됩니다. 이 책도 그렇게 섞어 씁니다. 핵심 원칙은 하나입니다. "빌드가 까다로운 패키지(dlib, OpenCV 등)는 conda-forge로 먼저 깔고, 그 위에 순수 파이썬 패키지를 pip으로 얹는다." 이 순서를 지키면 충돌이 크게 줄어듭니다.

이 장에서 기억할 것

pip install dlib이 실패하는 것은 여러분의 실수가 아니라 dlib이 C++ 빌드를 요구하기 때문이며, 더 빠른 uv로 바꿔도 빌드라는 벽은 그대로 남습니다. conda는 conda-forge 채널에서 이미 컴파일된 완제품을 가져와 빌드 자체를 건너뛰고, 파이썬 바깥의 의존성까지 함께 관리해 줍니다. 그래서 이 책은 conda로 실습 환경을 꾸립니다. 다음 장에서는 이 conda를 가장 가볍게 들여놓는 방법인 Miniconda 설치부터 시작합니다.