Prompts Interativos
Prompts interativos coletam a entrada do usuário para assistentes, confirmações e configuração guiada. Use os prompts embutidos do Click para casos simples; questionary para UIs de seleção ricas.
Receita
import questionary
name = questionary.text("Nome do projeto:").ask()
framework = questionary.select("Framework?", choices=["FastAPI", "Django", "Flask"]).ask()
confirmed = questionary.confirm("Prosseguir?").ask()Quando usar isso:
- Assistentes de scaffolding de projeto (estilo
cookiecutter) - Operações destrutivas que exigem confirmação
- Configuração de várias etapas onde flags seriam desajeitadas
Exemplo de Trabalho
import questionary
from rich.console import Console
console = Console()
def run_setup_wizard() -> dict:
if not questionary.confirm("Executar configuração interativa?").ask():
raise SystemExit("Abortado")
answers = {
"name": questionary.text("Nome do projeto:", validate=lambda t: len(t) > 0 or "Obrigatório").ask(),
"framework": questionary.select(
"Framework web:",
choices=["FastAPI", "Django", "Flask"],
).ask(),
"database": questionary.checkbox(
"Recursos:",
choices=["postgres", "redis", "celery"],
).ask(),
"deploy": questionary.select(
"Destino de implantação:",
choices=["Docker", "Lambda", "VPS"],
).ask(),
}
if not questionary.confirm(f"Criar {answers['name']} com {answers['framework']}?").ask():
raise SystemExit("Abortado")
return answers
if __name__ == "__main__":
config = run_setup_wizard()
console.print(f"[green]Criando projeto: {config}[/green]")O que isso demonstra:
- Tipos de prompt de texto, seleção, caixa de seleção e confirmação
- Validação na entrada de texto
- Abortar em caso de cancelamento (Ctrl+C ou Não)
- Saída rica após a conclusão do assistente
Mergulho Profundo
Seleção de Prompt
| Biblioteca | Melhor para |
|---|---|
click.confirm/prompt | Confirmação/texto simples |
questionary | Seleção, caixa de seleção, autocompletar |
prompt_toolkit | REPL completo personalizado |
InquirerPy | Alternativa ao questionary |
Armadilhas
- Prompts interativos em CI - trava para sempre. Correção: detectar
CI=trueou flag--yespara pular prompts. - Sem padrão para confirmação destrutiva - sim acidental. Correção:
default=Falseemconfirm(). - Eco de senha - visível na tela. Correção:
questionary.password()ouclick.prompt(hide_input=True). - Prompts sem fallback não interativo - quebra a scriptagem. Correção: cada prompt precisa de um equivalente de flag CLI.
- Unicode em terminais Windows - problemas de exibição. Correção: Console Rich ou habilitar terminal UTF-8.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Apenas flags CLI | Automação scriptável | Configuração guiada pela primeira vez |
| Configuração baseada na web | Configuração complexa | Ferramenta apenas de terminal |
| Arquivo de configuração | Implantações repetíveis | Onboarding inicial |
FAQs
questionary ou click.prompt?
click.prompt para texto/confirmação simples. questionary para seleção, caixa de seleção, autocompletar.
Como pular prompts em CI?
if os.environ.get("CI"): use os padrões ou flag --yes / --non-interactive.
Como lidar com Ctrl+C?
questionary retorna None ao cancelar. Verifique e saia graciosamente.
Entrada de senha?
questionary.password("Chave de API:").ask().
Autocompletar?
questionary.autocomplete("Caminho:", choices=lista_de_arquivos).ask().
Posso estilizar prompts?
questionary suporta dicionários de estilo para cores.
Testando CLIs interativos?
Simule os valores de retorno de questionary.text(...).ask() em pytest.
Assistentes de várias páginas?
Encadeie prompts em funções; mostre o progresso com Rich.
prompt_toolkit quando?
Construindo um REPL completo ou entrada com realce de sintaxe. Mais pesado que questionary.
Seleções padrão?
questionary.select(..., default="FastAPI").ask().
Relacionados
- Click - confirmação/prompt embutido
- Saída Rica - saída formatada do assistente
- Configuração e Ambiente - configuração pós-assistente
- Melhores Práticas de CLI - interativo vs. scriptável
Versões do Stack: Esta página foi escrita para Python 3.14.0, FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, e uv 0.6+.