Для целей этого сравнения было выделено 10 основных категорий, которые важны, когда речь идет об управлении Python проектом:
pyenv
$ pyenv versions
2.7.10
* 3.5.0 (set by /Users/yuu/.pyenv/version)
miniconda3-3.16.0
pypy-2.6.0
$ python --version
Python 3.6.0
$ pyenv global pypy-2.6.0
$ python --version
Python 2.7.9 [PyPy 2.6.0 with GCC 4.9.2]
$ cd /Volumes/treasuredata/jupyter
$ pyenv version
miniconda3-3.16.0 (set by /Volumes/treasuredata/.python-version)
$ python --version
Python 3.4.3 :: Continuum Analytics, Inc.
venv
- простой вариант доступный сразу.virtualenv
- если не устраивает venv
.venv
от virtualenv
:
app-data
);pip
$ python -m pip install SomePackage # latest version
$ python -m pip install 'SomePackage>=1.0.4' # with version
$ python -m pip install --upgrade SomePackage # upgrade package
$ python -m pip uninstall SomePackage # uninstall
$ python -m pip install -r requirements.txt # using requirements
$ python -m pip list
Package Version
------------ -------
SomePackage 0.0.1
$ python -m pip freeze
SomePackage==0.0.1
pipx
$ pipx install hello
installed package hello 2.0.3, Python 3.7.3
These apps are now globally available
- hello
done! ✨ 🌟 ✨
$ pipx list
venvs are in /home/user/.local/share/pipx/venvs
apps are exposed on your $PATH at /home/user/.local/bin
package hello 2.0.3, Python 3.7.3
- hello
# Now you can run hello from anywhere
$ hello World
Hello, World!
# This will install the package in an isolated, temporary directory and invoke the app.
$ pipx run hello Isolated world
Hello, Isolated world!
build & setuptools & twine
flit
maturin
hatchling
conda-build
rattler-build
task
(taskfile.dev)
Taskfile.yml
:
poethepoet
pyproject.toml
:
cookiecutter
cookiecutter
├── README.md
├── {{ cookiecutter.repo_name }}/
│ ├── src/
│ ├── __init__.py
│ ├── {pipeline name 1}.smk
│ ├── ...
│ └── {pipeline name n}.smk
├── research/
├── _quarto.yaml
└── pyproject.toml
cookiecutter.json
:
copier
copier
:
my_copier_template/
├── copier.yml
├── .git/
├── {{project_name}}
│ └── {{module_name}}.py.jinja
└── {{_copier_conf.answers_file}}.jinja
copier.yml
:
pipenv
pipenv
: примерыpipenv
:
poetry
poetry
: примерыpoetry scripts
:
conda
/mamba
conda
/mamba
: примерыenvironment.yml
файла:
hatch
hatch
: примерыpyproject.toml
для сборки:
pyproject.toml
:
pixi
pixi
: примерыpixi.toml
с несколькими окружениями:
[dependencies]
python = ">=3.12"
fastapi = ">=0.105.0"
uvicorn = "*"
[feature.test.dependencies]
pytest = "*"
pytest-md = "*"
[feature.test.tasks]
test = "pytest --md=report.md"
[environments]
default = {features = ["test"], solve-group = "prod-group"}
prod = {features = [], solve-group = "prod-group"}
pixi.toml
:
rye
: примерыpyproject.toml
:
[project.scripts]
my-hello-script = 'hello:main'
[tool.rye.scripts]
# These three options are equivalent:
devserver = "flask run --app ./hello.py --debug"
devserver-alt = ["flask", "run", "--app", "./hello.py", "--debug"]
devserver-explicit = { cmd = "flask run --app ./hello.py --debug" }
# Using env vars
devserver-env = { cmd = "flask run --debug", env = { FLASK_APP = "./hello.py" } }
devserver-env-file = { cmd = "flask run --debug", env-file = ".dev.env" }
# Chain call
lint = { chain = ["lint:black", "lint:flake8" ] }
"lint:black" = "black --check src"
"lint:flake8" = "flake8 src"
pdm
Категория/Инструмент | pipenv | poetry | conda | hatch | pixi | rye(uv) | pdm |
---|---|---|---|---|---|---|---|
Управление версией Python | ❌ | ❌ | ✅ | ❌ | ✅ | ✅ | ✅ |
Виртуальные окружения | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Управление пакетами | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ |
Управление научными пакетами | ❌ | ❌ | ✅ | ❌ | ✅ | ❌ | ❌ |
Воспроизводимые зависимости | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ |
Сборка и публикация пакетов | ❌ | ✅ | ❌ | ✅ | ❌ | ✅ | ✅ |
Сборка и публикация научных пакетов | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
Единый файл мета данный | ❌ | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ |
Автоматизация выполнения команд | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ |
Шаблонизация структуры проекта | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |