Script de linha de comandos robusto em Python, com testes
Escreva um script de linha de comandos em Python pronto para produção: argparse, logging, tratamento de erros, códigos de saída e testes com pytest. Pensado para ChatGPT, Claude e Microsoft Copilot. Inclui 6 variáveis personalizáveis e pode copiá-lo gratuitamente com um clique.
Intermédio · Código · Pendente de revisão editorial
Prompt
Age como um programador Python sénior que escreve ferramentas internas fáceis de manter.
Preciso de um script de linha de comandos chamado `{{script_name}}` que faça o seguinte: {{task}}.
Entradas: {{inputs}}.
Saídas esperadas: {{outputs}}.
Versão de Python: {{python_version}}. Dependências permitidas: {{dependencies}}.
Entrega, por esta ordem:
1. Desenho da interface: subcomandos (se fizerem sentido), argumentos posicionais, opções com valores por omissão e um exemplo de saída de `--help`.
2. O código completo num único ficheiro, com:
- `argparse`, `main(argv=None) -> int` e a proteção `if __name__ == "__main__"`.
- `logging` configurável com `--verbose` e `--quiet`, mensagens para stderr e resultados para stdout.
- Anotações de tipos completas, `pathlib` para caminhos e funções pequenas e puras separadas das operações de E/S.
- Uma opção `--dry-run` se o script modificar ficheiros ou sistemas externos.
- Códigos de saída documentados (0 sucesso, 1 erro de utilização, 2 erro nos dados, etc.).
3. Tratamento de erros: que exceções são capturadas, mensagens claras para o utilizador e sem tracebacks, exceto em modo verbose.
4. Testes com `pytest` (usando `tmp_path` e `capsys`) para o caminho feliz, entradas inválidas e casos-limite.
5. Instruções de utilização e como o empacotar com `pyproject.toml` como comando instalável.
Restrições:
- Segue a PEP 8 e não uses dependências fora da lista permitida.
- Não assumas formatos de dados que eu não tenha descrito: pergunta-me ou usa [PREENCHER].Como utilizar
- Explique a tarefa com um exemplo real de entrada e de saída.
- Diga se pode instalar dependências ou se tem de se limitar à biblioteca padrão.
- Guarde o script e os testes e execute o
pytestantes de o usar com dados reais. - Experimente sempre primeiro com
--dry-run.
Exemplo de utilização
Script: renomear-faturas · Tarefa: renomear PDFs de faturas com a data e o fornecedor indicados num CSV · Apenas biblioteca padrão.
Exemplo de resultado
2. Código (excerto de renomear_faturas.py)
from __future__ import annotations
import argparse
import csv
import logging
import sys
from pathlib import Path
log = logging.getLogger("renomear-faturas")
def novo_nome(data: str, fornecedor: str) -> str:
"""Função pura: '2025-03-14', 'Papelaria Sol' -> '2025-03-14_papelaria-sol.pdf'."""
return f"{data}_{'-'.join(fornecedor.lower().split())}.pdf"
def ler_csv(caminho: Path) -> dict[str, str]:
with caminho.open(newline="", encoding="utf-8") as f:
return {linha["ficheiro"]: novo_nome(linha["data"], linha["fornecedor"]) for linha in csv.DictReader(f)}
def main(argv: list[str] | None = None) -> int:
p = argparse.ArgumentParser(prog="renomear-faturas", description="Renomeia faturas PDF a partir de um CSV.")
p.add_argument("pasta", type=Path)
p.add_argument("csv", type=Path)
p.add_argument("--dry-run", action="store_true", help="mostra as alterações sem as aplicar")
nivel = p.add_mutually_exclusive_group()
nivel.add_argument("-v", "--verbose", action="store_true")
nivel.add_argument("-q", "--quiet", action="store_true")
args = p.parse_args(argv)
logging.basicConfig(level=logging.DEBUG if args.verbose else logging.ERROR if args.quiet else logging.INFO)
try:
alteracoes = ler_csv(args.csv)
except (OSError, KeyError) as e:
log.error("Não foi possível ler o CSV: %s", e)
return 2
for antigo, novo in alteracoes.items():
origem, destino = args.pasta / antigo, args.pasta / novo
if not origem.exists() or destino.exists():
log.warning("Ignorado: %s", antigo)
continue
print(f"{antigo} -> {novo}")
if not args.dry_run:
origem.rename(destino)
return 0
if __name__ == "__main__":
sys.exit(main())
Códigos de saída: 0 sucesso, 1 erro de utilização (o argparse devolve 2 por omissão: [PREENCHER] se os quiser uniformizar), 2 erro nos dados. O formato da data no CSV não foi descrito: [PREENCHER]…
Dados-chave
- Categoria
- Programação e desenvolvimento · Python
- Tipo de resultado
- Código
- Nível
- Intermédio
- Pensado para
- ChatGPT, Claude e Microsoft Copilot
- Verificado em
- Pendente de verificação editorial
- Variáveis
- Nome do script, Tarefa, Entradas, Saídas, Versão de Python e Dependências permitidas
- Idioma
- Português
- Preço
- Gratuito, sem registo
- Atualizado
- 07/11/2026
Perguntas frequentes
Porquê argparse em vez de Click ou Typer?
O argparse vem com o Python e não acrescenta dependências, o que ajuda em servidores restritos. Se puder instalar pacotes, indique Typer ou Click como dependências permitidas e o prompt adapta-se.
O que ganho em separar a lógica das operações de E/S?
Pode testar a lógica com testes rápidos que nunca tocam em ficheiros reais, e reutilizá-la noutros scripts ou numa API.
Para que serve este prompt?
Escreva um script de linha de comandos em Python pronto para produção: argparse, logging, tratamento de erros, códigos de saída e testes com pytest.
Com que ferramentas de IA funciona?
Foi pensado para ChatGPT, Claude e Microsoft Copilot. Ainda não o verificámos nestas ferramentas, pelo que os resultados podem variar entre elas.
Como personalizo o prompt?
Clique em “Personalizar” e preencha as variáveis (Nome do script, Tarefa, Entradas, Saídas, Versão de Python e Dependências permitidas). O texto atualiza-se instantaneamente e pode depois copiá-lo com um clique. Os valores ficam guardados apenas no seu navegador.
Preciso de experiência para o utilizar?
É de nível intermédio: convém conhecer o tema para fornecer bom contexto e rever o resultado com sentido crítico.
Este prompt é gratuito?
Sim. Todos os prompts do HomeCasa Prompts são gratuitos, sem registo nem subscrição. Pode também utilizá-los em projetos profissionais.
Posso confiar no resultado da IA?
Trate-o como um rascunho de qualidade: verifique sempre os dados, os números e as afirmações importantes antes de publicar ou tomar decisões.