의존성 지옥에 빠진 당신을 구하러 온 Pixi

Python
Package manager
Virtual environment
R
Tip
Author

Taeyoon Kim

Published

February 28, 2024

Modified

May 2, 2025

파이썬 의존성 문제는 프로젝트가 의존하는 패키지 간 충돌, 버전 관리의 어려움, 시스템 환경에 따른 호환성 문제 등으로 나타납니다. 다음과 같은 상황에서 의존성 지옥이 발생할 수 있습니다.

의존성 지옥을 피하려면 파이썬 의존성 관리 도구를 활용하여 각 프로젝트의 의존성을 격리해서 관리해야 합니다.

1 기존의 의존성 관리 도구

  • pip: 파이썬 기본 패키지 관리자로 패키지 설치 및 관리에 사용됩니다.
  • venv: Python 3.3부터 기본 제공되는 가상 환경 생성 도구로, 프로젝트별 독립적인 가상 환경을 만들어 각 프로젝트의 의존성을 분리하여 관리할 수 있습니다.
  • pipenv: PipfilePipfile.lock 파일을 사용하여 의존성을 관리하며 가상 환경과 패키지 설치를 함께 처리합니다.
  • poetry: 프로젝트의 의존성 및 버전 관리, 패키지 빌드 및 배포 등을 지원하여 편리한 프로젝트 관리를 제공합니다.
  • conda: 데이터 과학 및 기계 학습을 위한 패키지 및 환경 관리 도구로 파이썬 패키지 외에도 다양한 라이브러리 및 도구를 관리할 수 있습니다.

2 새로운 의존성 관리 도구 pixi

Pixi는 기존 conda 생태계를 기반으로 구축된 빠른 소프트웨어 패키지 매니저로 Windows, macOS, Linux에서 신속하게 개발 환경을 구축하는 데 적합합니다. Docker 없이도 운영 체제 간 재현 가능한 환경을 생성하며 Python, R, C/C++, Rust, Ruby 등 다양한 언어를 지원합니다.

Warning

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를 호출할 수 있게 합니다.

Tip

설치 후 바로 사용하려면 터미널을 다시 시작해야 합니다.

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 파일은 현재 프로젝트의 종속성 및 버전을 정확하게 기록한 파일입니다.

Note

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
Tip

아직 패키지별로 채널을 선택하여 설치하는 명령어는 없는 것으로 보입니다. 따라서 당분간은 위의 명령어를 사용해야 합니다.

5.2.2 PyPI 의존성 추가

Prefix.dev에서 찾을 수 없는 파이썬 패키지의 경우 pixi add --pypi [패키지이름] 명령으로 설치할 수 있습니다.

Warning

현재 이 기능은 베타 버전입니다.

5.3 패키지 설치하기

pixi add 명령어는 기본적으로 pixi.toml 파일에 패키지 이름을 추가하는 역할을 하며, 동시에 pixi.lock 파일도 업데이트합니다. 만약 업데이트되지 않았다면 pixi install 명령어를 사용하여 업데이트와 설치를 동시에 진행할 수 있습니다. 습관적으로 사용하는 것을 권장합니다.

pixi install

5.4 패키지 삭제하기

설치한 패키지를 삭제하는 방법은 두 가지입니다. 두 번째 방법이 작동하지 않으면 첫 번째 방법을 시도해 보세요.

  1. pixi.toml 파일을 수정하고 pixi install 명령어를 입력합니다.
  2. pixi remove [패키지] 명령어를 사용합니다.
Note

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는 다양한 기능을 제공합니다. 공식 문서를 참고하여 더 많은 기능을 활용해 보세요.