의존성 지옥에 빠진 당신을 구하러 온 Pixi
파이썬 의존성 문제는 프로젝트가 의존하는 패키지 간 충돌, 버전 관리의 어려움, 시스템 환경에 따른 호환성 문제 등으로 나타납니다. 다음과 같은 상황에서 의존성 지옥이 발생할 수 있습니다.
- 의존성 충돌: 프로젝트에서 여러 패키지를 사용할 때, 각 패키지가 요구하는 의존성 버전이 서로 달라 충돌이 발생하여 프로젝트 실행이나 빌드가 실패할 수 있습니다.
- 의존성 업데이트: 새로운 기능 추가나 버그 수정을 위해 의존성을 업데이트할 때, 다른 패키지와의 호환성 문제가 생길 수 있습니다. 특히 다른 패키지들이 특정 버전에 의존하는 경우 업데이트가 어려울 수 있습니다.
- 환경별 차이: 개발, 테스트, 프로덕션 환경마다 필요한 의존성이 다를 수 있어 각 환경별 의존성 관리가 복잡해질 수 있습니다.
의존성 지옥을 피하려면 파이썬 의존성 관리 도구를 활용하여 각 프로젝트의 의존성을 격리해서 관리해야 합니다.
1 기존의 의존성 관리 도구
pip
: 파이썬 기본 패키지 관리자로 패키지 설치 및 관리에 사용됩니다.venv
: Python 3.3부터 기본 제공되는 가상 환경 생성 도구로, 프로젝트별 독립적인 가상 환경을 만들어 각 프로젝트의 의존성을 분리하여 관리할 수 있습니다.pipenv
:Pipfile
과Pipfile.lock
파일을 사용하여 의존성을 관리하며 가상 환경과 패키지 설치를 함께 처리합니다.poetry
: 프로젝트의 의존성 및 버전 관리, 패키지 빌드 및 배포 등을 지원하여 편리한 프로젝트 관리를 제공합니다.conda
: 데이터 과학 및 기계 학습을 위한 패키지 및 환경 관리 도구로 파이썬 패키지 외에도 다양한 라이브러리 및 도구를 관리할 수 있습니다.
2 새로운 의존성 관리 도구 pixi
Pixi는 기존 conda
생태계를 기반으로 구축된 빠른 소프트웨어 패키지 매니저로 Windows
, macOS
, Linux
에서 신속하게 개발 환경을 구축하는 데 적합합니다. Docker
없이도 운영 체제 간 재현 가능한 환경을 생성하며 Python
, R
, C/C++
, Rust
, Ruby
등 다양한 언어를 지원합니다.
Pixi
는 활발히 개발 중이므로 아래 내용은 변경될 수 있습니다.
3 설치하기
공식 홈페이지에서는 아래 명령어를 통한 설치를 권장하지만, 저는 Homebrew를 선호합니다. 터미널에 brew install pixi
를 입력하면 간단하게 설치할 수 있습니다. 물론 Homebrew
가 미리 설치되어 있어야 합니다.
curl -fsSL https://pixi.sh/install.sh | bash
위 명령은 자동으로 최신 버전의 pixi
를 다운로드하여 ~/.pixi/bin
에 설치하고, ~/.bash_profile
을 업데이트하여 어디서든 pixi
명령을 실행할 수 있도록 합니다.
iwr -useb https://pixi.sh/install.ps1 | iex
위 명령은 자동으로 최신 버전의 pixi
를 다운로드하여 LocalAppData/pixi/bin
에 설치하고, 해당 경로를 시스템 환경 변수에 추가하여 어디서든 pixi
를 호출할 수 있게 합니다.
설치 후 바로 사용하려면 터미널을 다시 시작해야 합니다.
4 삭제하기
rm ~/.pixi/bin/pixi
이 명령을 실행해도 pixi
로 설치한 패키지는 계속 사용할 수 있습니다. 이를 완전히 제거하려면 ~/.pixi
디렉토리 전체를 삭제해야 합니다.
$PIXI_BIN = "$Env:LocalAppData\pixi\bin\pixi"; Remove-Item -Path $PIXI_BIN
5 사용법
5.1 프로젝트 시작하기
새 프로젝트를 시작할 때는 다음 명령어를 사용합니다. --format pyproject
옵션을 생략하면 pyproject.toml
대신 pixi.toml
파일이 생성됩니다.
pixi init --format pyproject hello-world
cd hello-world
명령어를 실행하면 다음과 같은 파일 구조가 생성됩니다.
.
├── pyproject.toml
└── src
└── hello_world
└── __init__.py
3 directories, 2 files
pyproject.toml
파일에 의존성 정보가 저장되며, 내용은 다음과 같습니다.
[project]
authors = [{name = "NAME", email = "EMAIL"}]
dependencies = []
name = "hello-world"
requires-python = ">= 3.11"
version = "0.1.0"
[build-system]
build-backend = "hatchling.build"
requires = ["hatchling"]
[tool.pixi.workspace]
channels = ["conda-forge"]
platforms = ["osx-arm64"]
[tool.pixi.pypi-dependencies]
hello_world = { path = ".", editable = true }
5.2 의존성 추가
의존성을 추가할 때 가장 먼저 해야 할 작업은 파이썬 버전을 지정하는 것입니다. pixi
는 자체적으로 Python 버전 설치를 지원합니다. 다음 pixi add
명령어를 사용하세요.
pixi add python==3.10
위 명령어를 실행하면 숨겨진 폴더(.pixi
)와 pixi.lock
파일이 생성됩니다. .pixi
폴더는 설치된 패키지들이 저장되는 곳이고, pixi.lock
파일은 현재 프로젝트의 종속성 및 버전을 정확하게 기록한 파일입니다.
pixi.lock
파일은 pixi add
를 실행하거나 toml
파일을 수동으로 변경한 뒤 pixi install
을 실행할 때 자동으로 생성됩니다.
다른 원하는 패키지를 설치할 때도 pixi add
명령어를 사용할 수 있습니다. 항상 Prefix.dev에서 지원되는 패키지를 검색하고 명령어를 확인하세요.
5.2.1 채널 추가하기
pixi
는 기본적으로 conda-forge
를 기본 패키지 채널로 사용합니다. conda-forge
에 원하는 패키지가 없는 경우 다음과 같이 다른 채널을 추가할 수 있습니다.
pixi project channel add bioconda
Added bioconda (https://conda.anaconda.org/bioconda/)
pixi add anndata2ri
Added anndata2ri
아직 패키지별로 채널을 선택하여 설치하는 명령어는 없는 것으로 보입니다. 따라서 당분간은 위의 명령어를 사용해야 합니다.
5.2.2 PyPI 의존성 추가
Prefix.dev에서 찾을 수 없는 파이썬 패키지의 경우 pixi add --pypi [패키지이름]
명령으로 설치할 수 있습니다.
현재 이 기능은 베타 버전입니다.
5.3 패키지 설치하기
pixi add
명령어는 기본적으로 pixi.toml
파일에 패키지 이름을 추가하는 역할을 하며, 동시에 pixi.lock
파일도 업데이트합니다. 만약 업데이트되지 않았다면 pixi install
명령어를 사용하여 업데이트와 설치를 동시에 진행할 수 있습니다. 습관적으로 사용하는 것을 권장합니다.
pixi install
5.4 패키지 삭제하기
설치한 패키지를 삭제하는 방법은 두 가지입니다. 두 번째 방법이 작동하지 않으면 첫 번째 방법을 시도해 보세요.
pixi.toml
파일을 수정하고pixi install
명령어를 입력합니다.pixi remove [패키지]
명령어를 사용합니다.
PyPI로 설치한 패키지는 pixi remove --pypi [패키지]
명령으로 삭제할 수 있습니다.
5.5 실행하기
5.5.1 Shell 실행
pixi shell
5.5.2 명령어 실행
pixi run [명령어]
형식으로 실행합니다.
pixi run python --version
Python 3.10.0
6 의존성 파일 공유
6.1 toml 파일 저장하기
pixi
는 기본적으로 모든 의존성 정보를 toml
파일에 저장하므로, pixi install
명령어를 실행하면 자동으로 파일이 생성됩니다.
6.2 yml 파일로 의존성 저장하기
아직 명령어로 직접 지원하지 않지만, 다음과 같이 conda
명령어를 통해 우회할 수 있습니다.
pixi run conda env export -f env.yml
6.3 가상 환경 삭제
아직 명령어로 직접 지원하지 않습니다. 프로젝트 폴더 전체를 삭제하거나 pixi
관련 파일을 삭제하는 방법으로 우회합니다.
rm -rf .pixi
rm pixi.toml
rm pixi.lock
7 Pixi 삭제하기
brew
명령어로 설치했다면 brew uninstall pixi
로 간단하게 삭제할 수 있습니다. 다른 방법으로 설치했다면 시스템에서 pixi
바이너리를 직접 삭제해야 합니다. 다만, 바이너리 삭제 후에도 pixi
로 설치한 도구들은 계속 사용할 수 있습니다. 이들을 함께 제거하려면 ~/.pixi
디렉토리 전체를 삭제하고, 사용하는 쉘 설정 파일에서 해당 경로를 제거해야 합니다.
rm ~/.pixi/bin/pixi
$PIXI_BIN = "$Env:LocalAppData\pixi\bin\pixi"; Remove-Item -Path $PIXI_BIN
8 다른 도구에서 마이그레이션
8.1 requirements.txt
파일에서 의존성 가져오기
pixi add --pypi $(cat requirements.txt)
8.2 .yml
파일에서 의존성 불러오기
pixi init --import environment.yml
위 명령어를 사용하면 종속성이 포함된 toml
파일이 생성됩니다. 다만 pip
패키지의 종속성 중 git+URL
형식은 지원하지 않으므로 직접 추가해야 합니다.
9 다중 가상 환경 다루기
pixi
를 사용하면 하나의 프로젝트 내에서 여러 개의 가상 환경을 구현할 수 있습니다. feature
라는 용어를 사용하여 다소 혼란스러울 수 있지만, 저는 주로 cuda11과 cuda12 환경을 분리할 때 사용합니다. 자세한 내용은 공식 문서를 참고하세요.
9.1 Cuda11과 Cuda12 환경 구현하기
CLI 명령어보다는 직접 toml
파일을 수정하는 것이 더 쉽습니다. 아래 예시처럼 수정하세요.
[project]
authors = [{name = "NAME", email = "EMAIL"}]
dependencies = []
name = "hello-world"
requires-python = ">= 3.11"
version = "0.1.0"
[build-system]
build-backend = "hatchling.build"
requires = ["hatchling"]
[tool.pixi.workspace]
channels = ["conda-forge"]
platforms = ["osx-arm64"]
[tool.pixi.pypi-dependencies]
hello_world = { path = ".", editable = true }
[tool.pixi.environments]
cuda11 = ["cuda11"]
cuda12 = ["cuda12"]
default = ["cuda11"]
[tool.pixi.feature.cuda11.system-requirements]
cuda = "11.0"
[tool.pixi.feature.cuda11.dependencies]
cuda-version = "~=11.8"
[tool.pixi.feature.cuda12.system-requirements]
cuda = "12.0"
[tool.pixi.feature.cuda12.dependencies]
cuda-version = "~=12.0"
default = ["cuda11"]
로 지정했기 때문에 -e
옵션 없이 실행하면 cuda11
feature가 사용됩니다.
9.2 다중 환경에 의존성 추가하기
특정 환경에만 의존성을 추가하려면 pixi add
명령어에 -f [feature 이름]
옵션을 추가해야 합니다. 그렇지 않으면 모든 환경에 의존성이 추가됩니다.
pixi add -f cuda12 pandas
9.3 다중 환경에서 실행하기
특정 환경을 실행하려면 pixi run
명령어에 -e [feature 이름]
옵션을 추가 사용해야 합니다.
pixi run -e cuda12 python
10 마치며
이 외에도 Pixi
는 다양한 기능을 제공합니다. 공식 문서를 참고하여 더 많은 기능을 활용해 보세요.