Python으로 데이터 분석이나 머신러닝을 시작할 때 가장 먼저 부딪히는 문제 중 하나가 개발 환경 구성이다.
같은 Python 코드를 작성해도 설치된 패키지 버전이 다르거나, Jupyter Notebook이 다른 Python 환경을 바라보고 있으면 예상하지 못한 오류가 발생할 수 있다. 그래서 프로젝트마다 독립된 가상환경을 만들고, 그 환경에서 필요한 패키지만 관리하는 습관이 중요하다.
이번 글에서는 다음 내용을 중심으로 정리한다.
ModuleNotFoundError 해결Anaconda는 Python을 활용한 데이터 분석, 과학 계산, 머신러닝 작업에 필요한 여러 도구를 편리하게 사용할 수 있도록 구성한 Python 배포판이다.
일반적으로 Python만 설치하면 필요한 라이브러리를 직접 하나씩 설치해야 한다.
예를 들어 데이터 분석을 시작하려면 다음과 같은 패키지를 자주 사용한다.
pandasnumpyscipymatplotlibscikit-learnjupyterAnaconda는 이런 데이터 분석 도구와 함께 Conda 패키지 및 환경 관리자를 제공한다.
즉, Anaconda의 핵심 장점은 단순히 패키지가 많이 들어 있다는 점보다는 Python 버전과 패키지를 환경별로 관리하기 쉽다는 데 있다.
Jupyter Notebook은 웹 브라우저에서 코드를 셀 단위로 작성하고 실행할 수 있는 개발 환경이다.
일반적인 Python 파일은 전체 프로그램을 한 번에 실행하는 경우가 많지만, Notebook에서는 필요한 코드만 조금씩 실행하면서 결과를 바로 확인할 수 있다.
예를 들어 다음처럼 데이터프레임을 생성한 뒤 바로 결과를 볼 수 있다.
import pandas as pd
users = pd.DataFrame({
"user_id": [101, 102, 103],
"visit_count": [5, 2, 8]
})
users
데이터 분석에서는 보통 다음과 같은 흐름으로 작업한다.
데이터 불러오기
↓
일부 데이터 확인
↓
전처리
↓
통계 계산
↓
시각화
↓
다시 코드 수정
이처럼 코드를 조금씩 실행하면서 중간 결과를 확인해야 하는 작업에서 Notebook이 특히 편리하다.
Python 프로젝트를 계속 만들다 보면 프로젝트마다 필요한 라이브러리와 버전이 달라진다.
예를 들어 다음 두 프로젝트가 있다고 하자.
프로젝트 A
- Python 3.11
- pandas 2.x
- scikit-learn 최신 버전
프로젝트 B
- Python 3.9
- pandas 구버전
- 특정 버전의 TensorFlow
모든 패키지를 하나의 Python 환경에 설치하면 패키지 업데이트 과정에서 서로 충돌할 수 있다.
가상환경을 사용하면 다음처럼 프로젝트 환경을 분리할 수 있다.
Base Python
├── analytics-env
│ ├── pandas
│ ├── scipy
│ └── matplotlib
│
└── ml-env
├── numpy
├── scikit-learn
└── pytorch
각 환경은 서로 독립적이기 때문에 한 프로젝트에서 패키지 버전을 변경해도 다른 프로젝트에 영향을 덜 준다.
가상환경을 사용하는 핵심 이유는 크게 두 가지다.
| 목적 | 설명 |
|---|---|
| 호환성 관리 | 프로젝트별 Python 및 라이브러리 버전을 분리할 수 있다. |
| 재현성 확보 | 다른 PC에서도 비슷한 환경을 다시 구성하기 쉬워진다. |
프론트엔드 개발에서 프로젝트마다 node_modules와 의존성 버전을 따로 관리하는 것과 비슷하게 생각하면 이해하기 쉽다.
Conda에서는 conda create 명령어로 새로운 환경을 만든다.
예를 들어 data-env라는 이름의 Python 3.11 환경을 만들고 싶다면 다음과 같이 실행한다.
conda create -n data-env python=3.11
여기서 주요 옵션은 다음과 같다.
conda create: 새로운 Conda 환경 생성-n data-env: 환경 이름을 data-env로 지정python=3.11: 해당 환경에서 사용할 Python 버전 지정설치 과정에서 패키지 목록이 표시되고 진행 여부를 묻는다면 내용을 확인한 뒤 설치를 진행하면 된다.
현재 PC에 만들어진 Conda 환경은 다음 명령어로 확인할 수 있다.
conda info --envs
또는 다음 명령어도 사용할 수 있다.
conda env list
실행 결과는 대략 다음과 같은 형태다.
base * .../anaconda3
data-env .../anaconda3/envs/data-env
* 표시는 현재 활성화된 환경을 의미한다.
실습에서도 base 환경과 별도로 만든 가상환경들이 정상적으로 목록에 표시되는 것을 확인할 수 있었다.
생성한 환경을 사용하려면 활성화해야 한다.
conda activate data-env
활성화에 성공하면 터미널 앞부분의 환경 표시가 바뀐다.
(data-env) >
이 상태에서 실행하는 python, pip, conda install 등의 명령은 기본적으로 해당 환경을 기준으로 동작한다.
현재 환경에서 빠져나오려면 다음 명령어를 사용한다.
conda deactivate
가상환경에서 base로 돌아왔다면 프롬프트가 다시 다음처럼 바뀐다.
(base) >
가상환경을 만들었다고 해서 Jupyter Notebook이 자동으로 그 환경을 사용하는 것은 아니다.
Notebook에는 Kernel이라는 개념이 있다.
Kernel은 실제 Python 코드를 실행하는 프로세스이고, Notebook 화면에서 선택한 Kernel이 어느 Python 환경을 사용하느냐에 따라 사용할 수 있는 패키지가 달라진다.
즉 다음 관계를 기억하면 된다.
Jupyter Notebook 화면
↓
선택한 Kernel
↓
특정 Conda 가상환경의 Python
↓
해당 환경에 설치된 패키지
먼저 사용할 환경을 활성화한다.
conda activate data-env
해당 환경에 Jupyter Notebook이 없다면 설치한다.
conda install jupyter notebook
설치 후에는 해당 환경에서 Notebook을 실행할 수 있다.
jupyter notebook
그러면 일반적으로 브라우저가 열리면서 로컬 Jupyter 화면이 표시된다.
가상환경을 Jupyter의 Kernel 목록에 등록하려면 ipykernel이 필요하다.
conda install ipykernel
다음 명령어를 실행한다.
python -m ipykernel install --user --name data-env --display-name "Python (data-env)"
각 옵션의 의미는 다음과 같다.
python -m ipykernel install: 현재 Python 환경을 Jupyter Kernel로 등록--user: 현재 사용자 계정에 Kernel 등록--name data-env: 내부적으로 사용할 Kernel 이름--display-name: Jupyter 화면에 표시할 이름등록이 끝나면 Notebook에서 Kernel을 선택할 때 Python (data-env) 같은 항목을 사용할 수 있다.
Jupyter Notebook을 사용하다 보면 다음과 같은 오류를 만날 수 있다.
import scipy
ModuleNotFoundError: No module named 'scipy'
이 오류는 현재 Notebook의 Python 환경에서 scipy 패키지를 찾지 못했다는 뜻이다.
단순하게 보면 두 가지 가능성이 있다.
1. 현재 환경에 scipy가 설치되지 않음
2. scipy는 다른 환경에 설치되어 있는데 Jupyter가 다른 Kernel을 사용 중
실습에서도 pandas는 정상적으로 import되었지만 scipy에서 ModuleNotFoundError가 발생했다.
따라서 패키지 오류를 해결할 때는 단순히 "설치했는가?"만 보지 말고 어느 환경에 설치했는가?를 함께 확인해야 한다.
먼저 터미널에서 올바른 환경이 활성화되어 있는지 확인한다.
conda activate data-env
그다음 필요한 패키지를 설치한다.
conda install scipy
설치가 완료된 뒤 Notebook에서 다시 실행한다.
import scipy
오류 없이 실행된다면 정상적으로 패키지를 불러온 것이다.
실습에서도 누락된 패키지를 설치한 뒤 다시 import했을 때 이전의 ModuleNotFoundError가 더 이상 나타나지 않는 것을 확인할 수 있었다.
가장 헷갈리기 쉬운 문제는 터미널 환경과 Jupyter Kernel이 서로 다른 경우다.
Notebook에서 다음 코드를 실행하면 현재 Python 실행 파일의 위치를 확인할 수 있다.
import sys
print(sys.executable)
출력 경로가 사용하려는 Conda 환경 안의 Python인지 확인하면 된다.
예를 들어 Windows라면 다음과 비슷한 구조가 될 수 있다.
...\anaconda3\envs\data-env\python.exe
반대로 base 환경의 Python 경로가 표시된다면 Notebook의 Kernel을 잘못 선택했을 가능성이 높다.
Conda 환경에 설치된 패키지는 다음 명령어로 확인할 수 있다.
conda list
특정 패키지만 확인하고 싶다면 운영체제에 따라 검색 명령을 함께 사용할 수도 있다.
conda list | findstr scipy
conda list | grep scipy
패키지가 목록에 없다면 현재 환경에는 설치되지 않은 것이다.
conda install과 pip install은 어떻게 구분할까?Conda 환경에서도 pip를 사용할 수 있지만 가능하면 설치 순서를 신경 쓰는 것이 좋다.
일반적으로 Conda에서 제공되는 패키지는 먼저 다음처럼 설치하는 편이 관리하기 쉽다.
conda install pandas scipy matplotlib
Conda 채널에 없거나 PyPI에서만 제공되는 패키지가 필요하면 그때 pip를 사용할 수 있다.
pip install some-package
중요한 것은 반드시 사용할 가상환경을 먼저 활성화한 뒤 설치하는 것이다.
conda activate data-env
pip install some-package
그렇지 않으면 패키지가 의도하지 않은 Python 환경에 설치될 수 있다.
실험용으로 기존 환경을 복사하고 싶을 때는 --clone 옵션을 사용할 수 있다.
conda create -n data-env-copy --clone data-env
이 방식은 다음과 같은 상황에서 유용하다.
현재 환경은 잘 동작함
↓
새 패키지 또는 버전을 테스트하고 싶음
↓
기존 환경은 유지
↓
복제 환경에서 변경 사항 테스트
실제 작업 환경을 바로 수정하는 것보다 안전하게 테스트할 수 있다.
복제된 환경도 다음 명령어로 확인할 수 있다.
conda info --envs
더 이상 사용하지 않는 환경은 삭제할 수 있다.
conda env remove -n data-env-copy
삭제 후에는 다시 환경 목록을 확인한다.
conda info --envs
목록에서 제거되었다면 정상적으로 삭제된 것이다.
가상환경의 가장 큰 장점 중 하나는 환경 구성을 파일로 남길 수 있다는 것이다.
현재 환경을 YAML 파일로 저장하려면 다음처럼 실행한다.
conda env export > environment.yml
그러면 Python 버전과 설치된 패키지 정보가 environment.yml에 기록된다.
다른 PC에서는 이 파일을 사용해 환경을 다시 만들 수 있다.
conda env create -f environment.yml
이 방식은 팀 프로젝트나 여러 PC에서 동일한 분석 환경을 유지해야 할 때 특히 유용하다.
다만 conda env export 결과에는 운영체제별 의존성이나 빌드 정보까지 포함될 수 있으므로, 장기간 공유할 환경이라면 파일 내용을 한 번 확인하는 것이 좋다.
실제로 자주 쓰는 명령어만 다시 정리하면 다음과 같다.
| 목적 | 명령어 |
|---|---|
| 환경 생성 | conda create -n data-env python=3.11 |
| 환경 목록 확인 | conda info --envs |
| 환경 활성화 | conda activate data-env |
| 환경 비활성화 | conda deactivate |
| 패키지 설치 | conda install pandas |
| 설치 패키지 확인 | conda list |
| 환경 복제 | conda create -n data-env-copy --clone data-env |
| 환경 삭제 | conda env remove -n data-env-copy |
| 환경 내보내기 | conda env export > environment.yml |
| 환경 파일로 생성 | conda env create -f environment.yml |
| Jupyter 실행 | jupyter notebook |
Conda를 사용하다 보면 설치나 환경 생성이 정상적으로 끝났더라도 경고 메시지가 출력될 수 있다.
예를 들어 새로운 패키지 설치 방식이나 기능을 안내하는 메시지는 오류가 아니라 정보성 경고일 수 있다.
이때 중요한 것은 다음 두 가지를 구분하는 것이다.
WARNING
→ 작업은 완료되었지만 확인할 내용이 있음
ERROR
→ 명령 실행 자체가 실패했을 가능성이 높음
환경 생성 후 다음 명령어에서 새 환경이 정상적으로 보인다면 우선 생성은 성공한 것이다.
conda info --envs
터미널 메시지를 볼 때는 모든 경고를 오류로 생각하기보다 명령의 최종 결과와 환경 상태를 함께 확인하는 습관이 중요하다.
가상환경을 처음 사용하면 "분명 패키지를 설치했는데 왜 Notebook에서는 안 되지?"라는 상황을 자주 만나게 된다.
이 문제는 대부분 다음 세 가지를 순서대로 확인하면 해결할 수 있다.
현재 터미널의 Conda 환경 확인
↓
패키지가 그 환경에 설치되어 있는지 확인
↓
Jupyter Notebook의 Kernel이 같은 환경인지 확인
즉, 패키지 문제처럼 보여도 실제 원인은 환경 연결 문제일 수 있다.
개발자 관점에서는 다음처럼 이해할 수 있다.
프로젝트 코드
↓
실행 환경
↓
설치된 의존성
코드 자체가 같아도 실행 환경이 다르면 결과가 달라질 수 있다. Python 데이터 분석에서도 결국 의존성과 실행 환경을 함께 관리하는 것이 중요하다.
conda create -n 환경명 python=버전으로 환경을 생성할 수 있다.conda info --envs에서 환경 목록과 현재 활성화된 환경을 확인할 수 있다.ModuleNotFoundError가 발생하면 패키지 설치 여부뿐 아니라 현재 Kernel이 어떤 Python 환경을 사용하는지 확인해야 한다.environment.yml을 활용하면 다른 PC에서도 비슷한 Conda 환경을 재구성할 수 있다.Python 데이터 분석 환경을 구성할 때 중요한 것은 단순히 Anaconda나 Jupyter를 설치하는 것보다 현재 어떤 Python 환경을 사용하고 있는지 명확하게 이해하는 것이다.
가상환경을 사용하면 패키지 충돌을 줄일 수 있고, 프로젝트별 의존성을 관리하기도 쉬워진다. 특히 Jupyter Notebook까지 함께 사용할 때는 터미널의 Conda 환경과 Notebook의 Kernel이 같은 환경을 바라보고 있는지 확인하는 습관이 중요하다.
처음에는 환경 생성, 활성화, Kernel 등록이 번거롭게 느껴질 수 있지만 이후 데이터 분석이나 머신러닝 프로젝트를 여러 개 진행하다 보면 가상환경 관리가 오히려 문제를 줄여주는 기본 도구라는 것을 알 수 있다.