Для целей этого сравнения было выделено 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.1pipx
$ 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 & twineflitmaturinhatchlingconda-buildrattler-buildtask (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.tomlcookiecutter.json:
copier
copier:
my_copier_template/
├── copier.yml
├── .git/
├── {{project_name}}
│ └── {{module_name}}.py.jinja
└── {{_copier_conf.answers_file}}.jinjacopier.yml:
pipenvpipenv: примерыpipenv:
poetrypoetry: примерыpoetry scripts:
conda/mambaconda/mamba: примерыenvironment.yml файла:
hatchhatch: примерыpyproject.toml для сборки:
pyproject.toml:
pixipixi: примеры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 | ❌ | ❌ | ✅ | ❌ | ✅ | ✅ | ✅ |
| Виртуальные окружения | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Управление пакетами | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ |
| Управление научными пакетами | ❌ | ❌ | ✅ | ❌ | ✅ | ❌ | ❌ |
| Воспроизводимые зависимости | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ |
| Сборка и публикация пакетов | ❌ | ✅ | ❌ | ✅ | ❌ | ✅ | ✅ |
| Сборка и публикация научных пакетов | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Единый файл мета данный | ❌ | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ |
| Автоматизация выполнения команд | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ |
| Шаблонизация структуры проекта | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |