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

Python
Package manager
Virtual environment
R
Tip
Author

Taeyoon Kim

Published

February 28, 2024

Modified

November 12, 2024

1 들어가며

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

  • 의존성 충돌: 프로젝트가 여러 개의 패키지를 사용하며, 각 패키지들이 서로 다른 버전의 의존성을 가질 때 발생합니다. 이로 인해 충돌이 발생하고, 프로젝트의 실행이나 빌드가 실패할 수 있습니다.

  • 의존성 업데이트: 새로운 기능을 추가하거나 버그를 수정하기 위해 의존성을 업데이트할 때, 다른 패키지들과의 호환성 문제가 발생할 수 있습니다. 특히, 다른 패키지들이 특정 버전에 의존하는 경우에는 업데이트가 어려울 수 있습니다.

  • 환경 별 차이: 개발 환경, 테스트 환경, 프로덕션 환경 등 각각의 환경에서는 다른 의존성이 필요할 수 있습니다. 이로 인해 각 환경마다 의존성을 관리하는 것이 복잡해질 수 있습니다.

의존성 지옥을 겪지 않고 싶다면 파이썬 의존성 관리 도구를 활용해 각 프로젝트의 의존성을 격리해서 관리 해야 합니다.

1.1 기존의 의존성 관리 도구

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

1.2 새로운 의존성 관리 도구

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

무엇보다도 빠르다는 것이 큰 장점입니다.

Warning

Pixi는 활발하게 개발되고 있기 때문에 아래의 명령어가 변경될 가능성이 있습니다.

2 설치하기

공식 홈페이지에서는 아래 명령어를 통해 설치하는 것을 추천합니다. 하지만 저는 Homebrew를 통해서 설치하는 것을 선호합니다. brew install pixi를 터미널에 입력하면 간단하게 할 수 있습니다. 물론 사전에 Homebrew를 해둔 상태에서 말이죠.

2.1 리눅스 혹은 맥

 curl -fsSL https://pixi.sh/install.sh | bash

위의 명령은 자동으로 최신 버전의 pixi를 다운로드해 ~/.pixi/bin에 설치합니다. 또한 ~/.bash_profile을 업데이트해 어디에서나 pixi 명령을 실행할 수 있도록 합니다.

2.2 윈도우즈

iwr -useb https://pixi.sh/install.ps1 | iex

위의 명령은 자동으로 최신 버전의 pixi를 다운로드해 LocalAppData/pixi/bin에 설치합니다. 또한 LocalAppData/pixi/bin을 자동으로 경로에 추가하여 어디에서나 pixi를 호출할 수 있게 합니다.

Tip

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

3 삭제하기

3.1 리눅스 혹은 맥

 rm ~/.pixi/bin/pixi

이 명령 이후에도 여전히 pixi로 설치한 패키지를 사용할 수 있습니다. 이를 제거하려면 ~/.pixi 전체 디렉토리를 삭제하면 됩니다.

3.2 윈도우즈

$PIXI_BIN = "$Env:LocalAppData\pixi\bin\pixi"; Remove-Item -Path $PIXI_BIN

4 기본 사용법

4.1 가상환경 만들기

새로운 프로젝트를 시작할 때는 다음 명령어를 사용합니다.

 pixi init hello-world
 cd hello-word

그러면 아래와 같은 3개의 파일이 생성됩니다.

.
├── .gitattributes
├── .gitignore
└── pixi.toml

0 directories, 3 **files******
  • pixi.toml에 의존성 패키지 정보가 저장되게 됩니다.

4.2 의존성 추가

원하는 패키지는 아래 명령어로 추가합니다. Prefix.dev에서 검색을 통해 지원되는 패키지와 명령어를 확인할 수 있습니다.

 pixi add python==3.10
 Added python 3.10

위 명령어를 실행하면 1개의 폴더(.pixi)와 pixi.lock이 생성되는 것을 알수 있습니다. .pixi폴더는 설치한 패키지들이 저장되는 곳이고 pixi.lock은 현재 프로젝트의 종속성 및 버전을 정확하게 기록한 파일입니다.

.
├── .gitattributes
├── .gitignore
├── .pixi
├── pixi.lock
└── pixi.toml

1 directory, 4 files
Note

pixi.lock파일은 pixi add를 실행하거나 수동으로 pixi.toml 파일을 변경한 뒤 pixi install을 실행할 때 생성됩니다.

4.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

아직 패키지 별로 채널을 선택해서 패키지를 설치하는 명령어는 없는 것으로 보입니다. 그러니 당분간은 위의 명령어를 사용할 수 밖에 없습니다.

4.2.2 PyPI 의존성 추가

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

Warning

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

4.3 패키지 설치하기

pixi add 명령어는 기본적으로 pixi.toml 파일에 패키지 이름을 추가하는 역할을 합니다. 보통은 동시에 pixi.lock파일도 업데이트가 됩니다. 그렇지 않은 경우에는 pixi install 명령어를 사용하면 업데이트와 설치가 동시에 됩니다. 그냥 항상 습관적으로 입력하세요.

 pixi install

4.4 패키지 삭제하기

설치한 패키지를 삭제하는 것은 2가지 방법이 있습니다. 두 번째 방법이 안되면 첫 번째방법으로 해보세요.

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

PyPI로 설치한 패키지는 pixi remove --pypi [패키지]로 삭제할 수 있습니다.

4.5 실행하기

4.5.1 shell 실행

 pixi shell

4.5.2 명령어 실행

pixi run [명령어] 형식으로 실행하면 됩니다.

 pixi run python --version
Python 3.10.0

4.6 파일로 의존성 저장하기

아직 명령어로 지원하고 있지 않습니다. 하지만 아래와 같이 conda 명령어로 우회할 수 있습니다.

 pixi run conda env export -f env.yml

4.7 .yml 파일에서 의존성 불러오기

 pixi init --import environment.yml

환경을 가져올 때, 환경 파일에서 종속성이 있는 pixi.toml이 생성됩니다. 다만 pip 패키지의 종속성으로 git+URL을 지원하지 않습니다.

4.8 가상환경 삭제

`

아직 명령어로 지원하고 있지 않습니다. 프로젝트 폴더 전체를 삭제하거나 pixi와 연관된 파일을 삭제하는 방법으로 우회합니다.

 rm -rf .pixi
 rm pixi.toml 
 rm pixi.lock

5 Pixi 삭제하기

저처럼 brew 명령어로 설치를 했다면 brew uninstall pixi로 간단하게 할 수 있습니다. 그렇지 않더라도 시스템에서 pixi를 제거하려면, 단순히 바이너리를 삭제하는 아래 명령어를 사용하면 됩니다. 다만 아래 명령어를 실행한 후에도, pixi로 설치한 도구들은 계속 사용할 수 있습니다. 이것들도 함께 제거하고 싶다면, ~/.pixi 디렉토리 전체를 삭제하고, 사용하는 쉘의 설정 파일에서 해당 경로를 삭제하면 됩니다.

5.1 리눅스와 맥

 rm ~/.pixi/bin/pixi

5.2 윈도우즈

$PIXI_BIN = "$Env:LocalAppData\pixi\bin\pixi"; Remove-Item -Path $PIXI_BIN

6 마치며

이것 말고도 Pixi에는 아주 많은 기능이 있습니다. 그러니 이 참에 공식문서를 한번 읽어보고 사용해보세요.