2026-01-08
## 한 줄 요약
Windows에서 export한 conda yaml은 WSL에서 그대로 쓰기 어렵고,
grep으로 yaml을 필터링해 최소 환경을 만든 뒤 pip로 분리 설치하는 방식이 가장 안정적이었다.
배경
수업에서 Miniforge를 사용해 conda 환경을 구성하라고 했는데,
나는 환경 관리를 WSL 중심으로 하고 싶어서 Windows에서 만든 yaml을 WSL에서 그대로 쓰고 싶었다.
보통 Windows에서 conda 환경을 만들고 conda env export로 yaml을 뽑은 뒤,
conda env create -f environment.yml
이렇게 재현하면 될 것 같지만,
WSL(Linux)에서는 아래와 같은 에러로 계속 막혔다.
LibMambaUnsatisfiableErrordoes not exist (perhaps a typo or a missing channel)opencv ... requires hdf5 >=... <... but none of the providers can be installedqt6-main, pyside6, libopencv, py-opencv, libpng, pcre2, libclang13 등 의존성 충돌
원인 분석
1. 플랫폼 차이 (Windows vs Linux)
conda 패키지는 소스 코드가 아니라 플랫폼별로 빌드된 바이너리인 경우가 많다.
그래서 Windows에서 export된 yaml에는 vc, ucrt, pywin32 같은
Windows 전용 런타임/툴체인 패키지가 포함될 수 있다.
이 패키지들은 Linux(WSL)에서는 존재하지 않기 때문에
solver가 “없는 패키지”를 만나자마자 실패한다.
2. ABI와 python_abi 제약
에러 로그에 자주 등장하는 python_abi는
파이썬 런타임 바이너리 호환성(cp310, cp311 등)을 의미한다.
OpenCV, numpy 같은 C/C++ 확장 모듈은
파이썬 버전과 ABI에 강하게 묶여 있는데,
- yaml에서
python=3.10.18이 강하게 고정되어 있고 - 다른 패키지는 cp311 / cp312 기준으로 빌드된 경우
solver는 조건을 동시에 만족할 수 없는 상태가 된다.
3. conda solver는 “제약 만족 문제”
conda(libmamba) solver는 결국
버전 범위 / 채널 / 플랫폼 제약을 모두 만족하는 조합을 찾는 문제를 푼다.
OpenCV, Qt 같은 패키지는 하위 의존성이 매우 많아서
하나만 잘못 고정돼도 해 공간 자체가 사라진다.
해결 전략
conda-forge + strict로 채널 일관성 확보- Windows 전용 패키지 제거
- 충돌의 중심(OpenCV / Qt) 패키지를 yaml에서 제거
- python 버전 고정 완화
- conda로 최소 환경 먼저 생성
- 필요한 대형 패키지는 pip로 분리 설치
실제 작업 기록
1. 채널 설정 (conda-forge + strict)
conda config --add channels conda-forge
conda config --set channel_priority strict
2. Windows 다운로드 폴더 접근
cd "/mnt/c/Users/SSAFY/Downloads"
ls | grep -E '\.ya?ml$'
3. YAML 1차 필터링
WIN_YML="prediction_wsl.yml"
OUT_YML="prediction_wsl_clean.yml"
grep -v -E '^[[:space:]]*-[[:space:]]*(_libavif_api|intel-openmp|khronos-opencl-icd-loader|libintl|libwinpthread|py-opencv|libopencv|qt6-main|ucrt|vc$|vc14_runtime|vs2015_runtime|pywin32|pywinpty)[=[:space:]]' \
"$WIN_YML" > "$OUT_YML"
4. YAML 2차 필터링 (OpenCV / Qt 제거)
grep -v -E '^[[:space:]]*-[[:space:]]*(opencv|py-opencv|libopencv|pyside6|qt6-main|pcre2|libpng)[=[:space:]]' \
"$OUT_YML" > prediction_wsl_min.yml
5. python 고정 완화
grep -v -E '^[[:space:]]*-[[:space:]]*python=.*' prediction_wsl_min.yml > prediction_wsl_min2.yml
6. 환경 생성
conda env create -f prediction_wsl_min2.yml
conda activate <환경이름>
환경 생성 후 패키지 설치
OpenCV (headless)
pip install opencv-python-headless
PySide6 (GUI 필요 시)
pip install pyside6
pip 설치가 오래 걸릴 때
ps aux | egrep "pip|python|conda" | head
ss -tpn | head
배운 점
- Windows에서 export한 conda yaml은 WSL에서 그대로 재현하기 어렵다
- conda solver는 제약 만족 문제라, 제약을 줄이는 방향이 중요하다
- OpenCV / Qt 같은 대형 바이너리는 yaml에서 빼고 pip로 분리하는 게 현실적이다
- 환경 구성 문제도 OS / ABI / 의존성 그래프 관점에서 보면 이해가 쉬워진다