최근 Python 연습할 겸 이것저것 고민하면서, 레포지토리 하나를 셋업했다.
이번 연습에서는 Python 프로젝트 관리 도구들을 적용하는 것 또한 목표여서 하나씩 찾아보고 있었는데, 그 중 가상 환경(패키징) 관리 도구로써 Pixi를 접할 수 있었고, 사용 경험이 괜찮은 것 같아서, 이에 대한 소개와 사용하는 방법을 공유하고자 한다.
사용 환경은 다음과 같다.
- OS : Windows 11
- CPU : AMD 5600X
- Shell : Bash (Git)
추가적으로 Code Quality Watcher로 ruff를 셋업해두어서 pyproject.toml은 사전에 구성되어 있는 환경이다.
(ruff는 공부 더 하고 포스팅하는걸로..)
Pixi란?
Pixi by prefix.dev
None
pixi.sh
Pixi는 자신을 모든 환경의 개발자들을 위한 빠르고, 현대화된 재현 가능한 패키지 관리 도구라 설명한다.
핵심은 다양한 프로그래밍로 작성된 프로젝트 관리를 간편하게 해주는 올인원 도구이다.
현재 최신 버전은 0.49.0인 점을 보았을 때 정식 릴리즈 단계는 아닌 듯 하지만, Pixi 쓰면 다른거 안써도 된다고 말씀주신 Stack overflow 글을 보고 궁금해 찾아보게 되었다.
다른 패키지 도구들과의 차이점은 다음으로 소개되어 있다.
Conda와 비교하면, Lockfile들로 간접 의존성 문제를 해결하고, 프로젝트 매니징, 지정한 Task 를 실행할 수 있는 기능들이 포함된 것이 차별화된 기능으로 확인된다.
또한 Pixi는 Conda Package Repository를 기본으로 삼고 있다는 특징이 존재한다.
prefix.dev – solving software package management
The software package management platform for Python, C++, R, Rust and more
prefix.dev
본인은 Python 만을 상정하고 이를 접했지만, 현재 pixi.toml 을 통해 Rust까지 지원하는 듯 하고 Node.js, Java 등등으로 지원 언어를 넓혀가게 될 것 같다. Prefix-dev 회사 구성원을 보니 현재 5명이신데,,
Python 가상환경 Set Up
Step1. Install Pixi
Installation - Pixi by prefix.dev
None
pixi.sh
우선 Pixi를 설치해야한다.
Windows는 Installer를 사용해야하고, MacOs에서는 curl을 사용한다.
본인 환경에서는 설치 파일을 실행할 때 경고창이 확인되었었고, 설치 시에는 기본 경로 및 설정을 사용했다.
설치가 완료되면 pixi 명령어를 실행할 수 있게 된다.
Step2. Init Pixi
Pixi는 최초 프로젝트 셋업할 때 뿐만 아니라, 기존 프로젝트에 적용하는 것도 간편하다.
pixi init 명령어를 최초 셋업에 사용하며, 기존 프로젝트 루트 디렉토리에서 해당 명령어를 실행하면 된다.
처음 프로젝트를 셋업할 경우 추가 옵션을 주어 다음 명령어를 사용할 수 있다.
pixi init pixi-py --format pyproject
- 프로젝트 명이 pixi-py가 되고
- pyproject.toml을 pixi manifest 파일로 사용하게 된다.
본인의 경우 ruff를 사용하기 위해 pyproject.toml가 이미 존재했는데, 이런 경우 이를 확장해서 쓸건지 선택할 수 있다.
y는 pyproject.toml 하위에 pixi를 위한 추가 섹션이 생성되고, n를 입력하면 pixi.toml 파일이 별도로 생성된다.
pixi.toml 파일을 별도로 가져갔을 때도 사용에 이슈는 없었다.
ruff 등의 최신 Python 프로젝트 셋업들이 적용되는 기본 파일이 pyproject.toml이어서 확장성을 위해 이를 고려해준 것 같다.
이 과정을 통해 pixi manifest 파일을 설정하게 된다.
Step3. Set Up Manifest(.toml) File
가상환경 생성 전, pyproject.toml 또는 pixi.toml 파일을 수정해 의존성 & 다른 설정을 셋업하면 된다.
pyproject.toml - Pixi by prefix.dev
None
pixi.sh
pixi를 사용하기 위해선 workspace section 지정이 필요하고, 레포지토리(channels)와 실행 환경(platforms)을 지정하게 된다.
플랫폼의 경우 지정하지 않아도 현재 환경을 기준으로 잘 잡아주지만, 모두 지정해도 이슈는 없다.
결국 현재 환경을 기준으로 가상환경이 생성된다.
Pixi에선 현재 프로젝트에서 사용할 Python 버전 지정이 가능한데, 이 부분은 어떤 .toml을 사용하는지에 따라 지정 위치가 나뉜다.
pyproject.toml의 경우 project section에서 requires-python으로 지정하고, pixi.toml 파일이 있으면 dependencies section에서 다른 라이브러리 처럼 지정하면 된다.
두 파일이 같이 있을 경우 pixi.toml으로 지정될 거 같은데 이 부분은 직접 확인하진 못했다.
라이브러리의 의존성은 간단하다.
pixi 관련 section에서 지정하면 되는데, pyproject.toml의 경우 tool.pixi.dependencies section에서, pixi.toml의 경우 dependencies section에서 지정해주면 된다.
패키지 저장소를 pypi가 필요할 경우 명시적으로 지정할 수도 있는데, pypi-dependencies section을 사용하면 된다.
디폴트는 conda인 듯하다.
추가적으로 tasks section이 존재하는데, 여기에는 pixi를 통해 실행해야할 커맨드 등을 지정할 수 있게 된다.
test나 ruff 등을 pixi run 커맨드로 돌릴 수 있게 만들어주는 기능으로 확인된다.
본인이 셋업한 pyproject.toml은 다음과 같다.
[build-system]
requires = ["setuptools>=61.0", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "-"
version = "0.1.0"
requires-python = "==3.12.11"
[tool.ruff]
target-version = "py312"
line-length = 222
[tool.ruff.lint]
select = [
"E", # pycodestyle errors
"W", # pycodestyle warnings
"F", # pyflakes
"I", # isort
"B", # flake8-bugbear
"UP", # pyupgrade
"Q", # flake8-quotes
]
ignore = [
"E501", # line too long
]
[tool.ruff.lint.per-file-ignores]
"__init__.py" = ["F401"]
[tool.ruff.lint.isort]
known-first-party = ["scrapy_project"]
force-single-line = false
combine-as-imports = true
[tool.ruff.format]
quote-style = "double"
indent-style = "space"
line-ending = "auto"
[tool.pixi.workspace]
channels = ["conda-forge"]
platforms = ["linux-64", "osx-arm64", "osx-64", "win-64"]
[tool.pixi.tasks]
[tool.pixi.dependencies]
scrapy = "==2.13.2"
pixi-pycharm = ">=0.0.8,<0.0.9"
만약, pixi.toml으로 따로 빼게 되면, pixi.toml 파일은 다음과 같아진다.
[workspace]
channels = ["conda-forge"]
platforms = ["linux-64", "osx-arm64", "osx-64", "win-64"]
[tasks]
[dependencies]
scrapy = "==2.13.2"
pixi-pycharm = ">=0.0.8,<0.0.9"
Step4. Create Env
위 과정이 끝나면 다음 명령어를 실행하여 .toml 기반으로 가상환경을 생성할 수 있다.
pixi install
Step5. Use Env
이후 가상 환경을 사용하면 되는데, 2가지 방법이 존재한다.
conda activate처럼 가상환경이 적용된 쉘 모드에 들어가는 pixi shell과, 명령어를 가상환경에서 실행하는 pixi run이 존재한다.
pixi shell을 사용하면 가상환경으로 들어가진 것을 확인할 수 있다.
pixi run {원하는 명령어}을 사용해 가상환경에서 명령어를 실행할 수 있다.
pixi run python --version
여기까지만 해주면 Pixi를 통한 Python 가상 환경 구성이 끝난다.
의존성도 명확해지고, pyproject.toml을 통해 하나의 manifest 파일로 프로젝트를 통합하여 관리할 수 있다는 점도 명확한 장점인 것 같다.
후술하겠지만, .toml 을 모두 구성하고 나면 다른 컴퓨터에서는 pixi를 설치하고 pixi run 또는 shell만 실행하게 되면 자동으로 가상환경이 설치된 후 실행되기 때문에 가상환경에 소요되던 시간을 줄일 수 있을 것 같다.
Appendix
Unsupported shell : Bash(bash) - on Windows with git bash
Windows에서 git bash를 사용할 때는 pixi shell이 실행되지 않는다. (run은 동작한다)
Windows에서 Pixi 설치할 때 bash 용 pixi bin 파일이 없기 때문인 것으로 추정되는데 본인은 bash가 편해서 pixi run을 Alias를 걸어 사용하고 있다.
Pycharm Interpreter Setting
공식 문서에 명시되어 있다.
Jetbrains - Pixi by prefix.dev
None
pixi.sh
- pixi add pixi-pycharm 로 의존성 추가
- Windows에선 CMD에서 pixi run 'echo $CONDA_PREFIX\\libexec\\conda.bat 실행
만약 이렇게 해도 안잡히면, 프로젝트 루트에 생성된 .pixi 디렉토리 하위에서 conda.bat 찾아서 파일을 잡아주면 Interpreter 설정이 가능하다.
Zero Setup - Skip Init & Install
pixi 설치되어 있고 .toml 파일만 구성되어 있으면 `pixi shell`이나 `run`만 사용해도 알아서 가상 환경 설치(install)가 진행된다.
따라서, 특정 환경에서 구성이 끝나면, 다른 개발 환경에서는 pixi 설치 -> pixi run 만 해도 가상환경 셋업이 끝난다.
Command
주요 명령어는 다음과 같다.
- pixi init
- 최초 셋업 (manifest 파일 생성)
- pixi install
- .toml 기반으로 가상환경 설치
- pixi shell
- 가상환경 활성화된 쉘 모드 진입
- pixi run
- 가상환경에서 명령어나 지정한 task 실행
- pixi info
- pixi workspace 정보 확인
- pixi list
- 현재 가상환경의 의존성들 확인
- pixi tree
- 현재 가상환경의 의존성들 관계 트리로 확인
- pixi update
- .toml에 수정 사항 존재 시 현재 가상 환경에 반영
- pixi clean
- 현재 가상 환경 삭제
- pixi add
- 의존성 .toml 파일에 추가
- pixi remove
- 의존성 .toml 파일에서 제거
'Tech > Python' 카테고리의 다른 글
Python @staticmethod, @classmethod 차이 with 클래스 변수, 인스턴스 변수 (2) | 2024.07.13 |
---|---|
Python Dataclass 개념 및 장점 - 좋은 코드를 위한 습관 (3) | 2024.06.02 |
Python Packing & Unpacking - 파이썬 *, ** 사용법 (4) | 2024.04.25 |
파이썬이 컴파일을 한다고? - Python Compile (4) | 2023.11.23 |