Back to posts
2026년 4월 23일

Python 'ModuleNotFoundError' 완전 정복: 가상환경(venv, conda) 설정 및 의존성 패키지 관리법

1. 파이썬의 지옥, "제 컴퓨터에서는 잘 되는데 서버에서는 안 돼요"

파이썬으로 데이터 분석이나 AI 코딩을 시작하는 초보자들이 가장 먼저 맞닥뜨리는 통곡의 벽은 파이썬 문법 자체의 어려움이 아닙니다. 터미널 창에 pip install pandas를 치고 분명히 화려한 진행 바와 함께 설치 완료(Successfully installed) 메시지를 봤음에도 불구하고, VSCode에서 스크립트를 실행하면 터지는 ModuleNotFoundError: No module named 'pandas' 에러입니다. 이 붉은 에러는 초보자의 코딩 의지를 단번에 꺾어버립니다.

이 기이하고 미스터리한 현상의 원인은 사용자 PC에 파이썬이 여러 버전(운영체제 기본 내장 파이썬, Anaconda로 설치된 파이썬, 공식 홈페이지에서 다운받은 파이썬 등)으로 파편화되어 난립해 있기 때문입니다. 터미널에서 pip 명령어로 패키지를 들이부은 곳은 A라는 경로의 파이썬 인터프리터인데, VSCode나 Pycharm 에디터가 재생 버튼을 누를 때 사용하는 인터프리터는 B라는 엉뚱한 파이썬을 가리키고 있으니 당연히 모듈을 찾을 수 없는 것입니다. 이렇게 글로벌 시스템 영역 공간에 무분별하게 패키지를 설치하다 보면 프로젝트마다 요구하는 버전들이 뒤엉켜 결국 OS 포맷 말고는 답이 없는 끔찍한 '의존성 지옥(Dependency Hell)'에 빠지게 됩니다.

2. 구원자, 가상환경(Virtual Environment)의 등장

이러한 비극을 막기 위한 파이썬 생태계의 절대 불변의 제1원칙은 "프로젝트 폴더마다 완전히 격리된 독립적인 파이썬 샌드박스 방을 만들어 준다"는 가상환경 패러다임입니다.

파이썬 3.3부터 기본으로 내장된 venv 모듈을 사용하면 외부 라이브러리 없이도 쉽게 구축할 수 있습니다. 프로젝트 폴더 안에서 python -m venv myenv 명령어를 치는 순간, 내부에 아주 깨끗하고 텅 빈 파이썬 인터프리터 실행 파일과 라이브러리 폴더 사본이 복제되어 myenv라는 디렉토리로 생성됩니다. 이후 Windows라면 myenv\Scripts\activate, Mac/Linux라면 source myenv/bin/activate를 입력해 가상환경을 '활성화(Activate)'하면 터미널 프롬프트 앞에 (myenv)라는 괄호 글자가 붙게 됩니다. 이 상태에서 하는 모든 pip install 행위는 글로벌 환경을 1비트도 더럽히지 않고 오직 이 폴더 내부에만 얌전하게 격리되어 저장됩니다.

3. Requirements.txt와 Docker의 파이프라인 무결성

로컬에서 가상환경을 구축하여 코드를 완성했다면, 내 컴퓨터에서 돌아가는 완벽한 세팅을 동료의 컴퓨터나 AWS 클라우드 프로덕션 서버에서도 토씨 하나 틀리지 않고 똑같이 복제할 수 있어야 합니다. 가상환경이 켜진 상태에서 pip freeze > requirements.txt 명령어를 치면, 현재 환경에 설치된 모든 패키지와 정확한 버전 정보(예: numpy==1.21.0, requests==2.26.0)가 텍스트 파일로 고스란히 추출됩니다.

이 텍스트 파일만 Git 저장소에 올려두면, 팀원은 코드를 내려받고 빈 가상환경을 켠 뒤 pip install -r requirements.txt 단 한 줄만 터미널에 입력하면 당신과 100% 동일한 실행 환경이 마법처럼 구축됩니다. 나아가 현대 데브옵스(DevOps) 환경에서는 아예 이 파이썬 환경 구축 과정 자체를 Docker 이미지의 Dockerfile 명령어로 빌드하여 OS 커널 레벨까지 통째로 컨테이너로 얼려버리는 방식을 채택함으로써, 파이썬의 고질적인 환경 세팅 이슈를 영구적으로 종식시켰습니다.

4. 자주 묻는 질문 (FAQ)

Q. 생성된 venv 폴더도 Git에 커밋(Commit)해서 깃허브에 같이 올려야 하나요?

절대 안 됩니다! 가상환경 폴더 안에는 수백 메가바이트 단위의 무거운 실행 파일과 라이브러리가 꽉 차 있으며, 결정적으로 운영체제(Windows vs Mac M1 칩 등) 프로세서 아키텍처에 따라 바이너리 구조가 완전히 달라서 다른 기기에서 다운로드해 봐야 호환되지도 않습니다. 반드시 프로젝트 루트 폴더의 .gitignore 파일 최상단에 myenv/ 라인을 추가하여 가상환경 폴더 전체가 통째로 GitHub에 올라가는 대참사를 막아야 합니다.

Q. 머신러닝 개발자들은 왜 가벼운 venv 대신 덩치 큰 아나콘다(Conda)를 선호하나요?

venv는 오직 순수 파이썬(Python)으로 작성된 패키지만 관리할 수 있는 한계가 있습니다. 반면 딥러닝 영상 처리에 필수적인 TensorFlow나 PyTorch, OpenCV 같은 무거운 AI 라이브러리들은 내부적으로 극강의 성능을 뽑아내기 위해 C++ 컴파일러, Fortran, 또는 NVIDIA CUDA GPU 하드웨어 드라이버 같은 시스템 OS 레벨의 바이너리 의존성을 강력하게 요구합니다. Conda는 파이썬뿐만 아니라 이러한 외부 운영체제 수준의 시스템 의존성 라이브러리까지 알아서 컴파일된 상태로 가상환경 내부로 격리해서 다운로드해 주기 때문에 데이터 사이언스 생태계의 거스를 수 없는 표준이 되었습니다.

Q. Poetry나 Pipenv 같은 도구는 또 무엇인가요?

단순한 piprequirements.txt의 조합은 패키지 간의 버전 충돌(A 라이브러리는 B의 1.0 버전을 원하고, C 라이브러리는 B의 2.0 버전을 원할 때)을 똑똑하게 풀어내지 못합니다. Poetry와 Pipenv는 자바스크립트의 npm이나 yarn처럼 락파일(lock file) 개념을 도입하여 수만 가지 의존성 트리를 정밀하게 계산하고 충돌을 방지해 주는 한 단계 진보된 차세대 패키지 매니저입니다.


OMANGAZI 편집팀

최신 IT 기술, 오픈소스 AI 생태계, 그리고 모던 웹 개발 트렌드를 연구하고 분석합니다. 단순한 정보 전달을 넘어 개발자들의 실무에 도움이 되는 깊이 있는 인사이트를 제공합니다.

관련 글 보기