Voltar ao Glossario
Glossario Python

Poetry: O que É e Como Funciona | Python Brasil

Aprenda Poetry em Python: gerenciamento de dependencias, ambientes virtuais, publicacao de pacotes, pyproject.toml e boas praticas para projetos modernos.

O que e Poetry?

Poetry e uma ferramenta moderna de gerenciamento de dependencias e empacotamento para projetos Python. Ela resolve varios problemas historicos do ecossistema Python ao unificar em uma unica ferramenta a gestao de dependencias, ambientes virtuais, build e publicacao de pacotes. Em vez de lidar com pip, virtualenv, setup.py e requirements.txt separadamente, o Poetry centraliza tudo no arquivo pyproject.toml.

Poetry garante builds reprodutiveis atraves do arquivo poetry.lock, que registra as versoes exatas de todas as dependencias e sub-dependencias instaladas.

Instalacao

# Instalacao recomendada (via pipx)
# pipx install poetry

# Ou via script oficial
# curl -sSL https://install.python-poetry.org | python3 -

# Verificar instalacao
# poetry --version

# Configurar para criar virtualenv dentro do projeto
# poetry config virtualenvs.in-project true

Criando um Projeto

# Criar novo projeto
# poetry new meu-projeto

# Estrutura gerada:
# meu-projeto/
#   pyproject.toml
#   README.md
#   meu_projeto/
#     __init__.py
#   tests/
#     __init__.py

# Ou inicializar em projeto existente
# cd projeto-existente
# poetry init

O Arquivo pyproject.toml

# pyproject.toml
# [tool.poetry]
# name = "minha-api"
# version = "1.0.0"
# description = "API REST para gerenciamento de tarefas"
# authors = ["Ana Silva <ana@email.com>"]
# license = "MIT"
# readme = "README.md"
# packages = [{include = "minha_api"}]
#
# [tool.poetry.dependencies]
# python = "^3.11"
# fastapi = "^0.109.0"
# uvicorn = {version = "^0.27.0", extras = ["standard"]}
# sqlalchemy = "^2.0"
# pydantic = "^2.5"
#
# [tool.poetry.group.dev.dependencies]
# pytest = "^8.0"
# pytest-cov = "^4.1"
# black = "^24.1"
# mypy = "^1.8"
# ruff = "^0.2"
#
# [tool.poetry.scripts]
# minha-api = "minha_api.cli:main"
#
# [build-system]
# requires = ["poetry-core"]
# build-backend = "poetry.core.masonry.api"

Gerenciamento de Dependencias

# Adicionar dependencia
# poetry add fastapi
# poetry add sqlalchemy@^2.0
# poetry add "uvicorn[standard]"

# Adicionar dependencia de desenvolvimento
# poetry add --group dev pytest black mypy

# Remover dependencia
# poetry remove flask

# Atualizar dependencias
# poetry update              # atualiza todas
# poetry update fastapi      # atualiza apenas fastapi

# Ver dependencias instaladas
# poetry show
# poetry show --tree          # arvore de dependencias
# poetry show --outdated      # dependencias desatualizadas

# Instalar dependencias do lock file
# poetry install              # todas
# poetry install --without dev  # sem dependencias de desenvolvimento

Ambiente Virtual

# Poetry cria e gerencia o virtualenv automaticamente

# Ver informacoes do ambiente
# poetry env info

# Ativar o shell do virtualenv
# poetry shell

# Executar comando no virtualenv sem ativar
# poetry run python script.py
# poetry run pytest
# poetry run uvicorn main:app --reload

# Listar ambientes virtuais
# poetry env list

# Remover ambiente virtual
# poetry env remove python3.11

# Usar versao especifica do Python
# poetry env use python3.12

Scripts e Comandos

# Definir scripts no pyproject.toml
# [tool.poetry.scripts]
# minha-cli = "minha_api.cli:main"
# servidor = "minha_api.server:start"

# arquivo: minha_api/cli.py
import argparse

def main():
    """Ponto de entrada da CLI."""
    parser = argparse.ArgumentParser(description='Minha API CLI')
    parser.add_argument('comando', choices=['iniciar', 'migrar', 'seed'])
    args = parser.parse_args()

    if args.comando == 'iniciar':
        print('Iniciando servidor...')
    elif args.comando == 'migrar':
        print('Executando migrations...')
    elif args.comando == 'seed':
        print('Populando banco de dados...')

# Apos `poetry install`, o comando fica disponivel:
# minha-cli iniciar

O Arquivo poetry.lock

# O poetry.lock garante reproducibilidade

# Gerar/atualizar o lock file
# poetry lock

# Instalar exatamente as versoes do lock
# poetry install

# IMPORTANTE: commite o poetry.lock no controle de versao!
# Isso garante que todos os desenvolvedores e ambientes
# de deploy usem exatamente as mesmas versoes.

# Verificar integridade
# poetry check

Publicacao de Pacotes

# Build do pacote
# poetry build
# Gera dist/minha_api-1.0.0.tar.gz e dist/minha_api-1.0.0-py3-none-any.whl

# Configurar repositorio (PyPI)
# poetry config pypi-token.pypi meu-token-do-pypi

# Publicar no PyPI
# poetry publish

# Build e publicar em um unico comando
# poetry publish --build

# Publicar em repositorio privado
# poetry config repositories.meu-repo https://meu-pypi.empresa.com/simple/
# poetry publish -r meu-repo

Configuracao de Ferramentas no pyproject.toml

# O pyproject.toml tambem configura outras ferramentas

# [tool.pytest.ini_options]
# testpaths = ["tests"]
# python_files = "test_*.py"
# addopts = "-v --cov=minha_api --cov-report=term-missing"
#
# [tool.black]
# line-length = 88
# target-version = ['py311']
#
# [tool.mypy]
# python_version = "3.11"
# strict = true
# warn_return_any = true
#
# [tool.ruff]
# line-length = 88
# select = ["E", "F", "I", "N", "W"]

Migrando de pip/requirements.txt

# Importar requirements.txt existente
# cat requirements.txt | xargs poetry add

# Script para migrar
import subprocess

def migrar_requirements(arquivo: str = 'requirements.txt'):
    """Migra dependencias de requirements.txt para Poetry."""
    with open(arquivo) as f:
        deps = [
            linha.strip()
            for linha in f
            if linha.strip() and not linha.startswith('#')
        ]

    for dep in deps:
        print(f'Adicionando: {dep}')
        subprocess.run(['poetry', 'add', dep])

# Exportar para requirements.txt (compatibilidade)
# poetry export -f requirements.txt -o requirements.txt --without-hashes

Erros Comuns

O erro mais frequente e nao committar o poetry.lock no repositorio, perdendo a garantia de reproducibilidade. Outro erro e misturar pip install com poetry add, instalando dependencias fora do controle do Poetry. Tambem e comum esquecer de executar poetry install apos clonar um repositorio, ou nao usar poetry run para executar scripts, usando o Python global em vez do ambiente virtual do projeto. Usar versoes de Python incompativeis com a restricao definida no pyproject.toml tambem gera erros.

Boas Praticas

Sempre commite o poetry.lock. Configure virtualenvs.in-project true para manter o virtualenv dentro do projeto. Use grupos de dependencias (dev, test, docs) para organizar dependencias. Exporte requirements.txt apenas para ambientes que exigem compatibilidade. Use poetry check para validar o pyproject.toml. Mantenha as restricoes de versao razoaveis — ^ permite atualizacoes compativeis, ~ permite apenas patches.

Quando Usar

Poetry e recomendado para qualquer projeto Python novo, especialmente quando envolve trabalho em equipe, deploy em multiplos ambientes ou publicacao de pacotes. Para scripts simples e de uso pessoal, pip com venv pode ser suficiente. A curva de aprendizado do Poetry e rapida e os beneficios de reproducibilidade e organizacao compensam rapidamente o investimento inicial.