# Python Poetry for Dependency Management

Poetry is a tool for dependency management and packaging in Python. It allows you to declare the libraries your project depends on and it will manage (install/update) them for you. It aims to replace `setup.py`, `requirements.txt`, `setup.cfg`, `MANIFEST.in`, and `Pipfile` with a simple `pyproject.toml` based project format.

## Installation

### Linux, macOS, Windows (WSL)

```bash
curl -sSL https://install.python-poetry.org | python3 -
```

### Windows (Powershell)

```powershell
(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -
```

## Basic Usage

### Initializing a Project

To create a new project:

```bash
poetry new my-project
```

To initialize poetry in an existing directory:

```bash
cd my-existing-project
poetry init
```

This will guide you through creating a `pyproject.toml` file.

### Adding Dependencies

To add a package to your project:

```bash
poetry add requests
```

To add a development dependency (e.g., for testing):

```bash
poetry add pytest --group dev
```

### Installing Dependencies

To install the dependencies defined in `pyproject.toml`:

```bash
poetry install
```

This command reads the `poetry.lock` file if it exists, ensuring reproducible builds. If not, it resolves dependencies and creates the lock file.

## Virtual Environments

Poetry automatically creates and manages a virtual environment for your project.

### Activating the Environment

To spawn a shell within the virtual environment:

```bash
poetry shell
```

To run a single command within the environment without activating the shell:

```bash
poetry run python script.py
```

### Configuration

You can configure Poetry to create virtual environments inside the project directory (similar to `venv`).

```bash
poetry config virtualenvs.in-project true
```

## The `pyproject.toml` File

This is the main configuration file.

```toml
[tool.poetry]
name = "my-project"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]

[tool.poetry.dependencies]
python = "^3.9"
requests = "^2.28.1"

[tool.poetry.group.dev.dependencies]
pytest = "^7.1.2"

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
```

[[programming/python/python]]