Domine o módulo argparse do Python: Crie CLIs melhores
Python é uma linguagem de programação avançada que permite aos desenvolvedores criar uma variedade de aplicativos, desde scripts básicos até grandes sistemas de software. Uma das tarefas de programação mais comuns é criar interfaces de linha de comando (CLIs), que permitem aos usuários interagir com programas por meio de um terminal ou linha de comando. As CLIs são essenciais para a criação de scripts, automação e instâncias em que uma interface gráfica de usuário não é prática.
A manipulação dos parâmetros da linha de comando é uma parte importante do projeto de CLIs. Esses argumentos permitem que os usuários influenciem o comportamento de um programa fornecendo parâmetros de entrada à medida que ele é executado. Sem a capacidade de avaliar esses fatores, os programas seriam menos versáteis e mais difíceis de ajustar para tarefas específicas.
O Python fornece vários módulos para analisar argumentos de linha de comando, mas o módulo argparse
se destaca por sua simplicidade e abrangência. O módulo argparse
facilita o desenvolvimento de interfaces de linha de comando funcionais. Ele lida automaticamente com a análise de parâmetros, exibe instruções úteis e apresenta erros quando os usuários fornecem informações incorretas.
Neste tutorial, veremos como usar o pacote Python argparse
. Começaremos com uma visão geral das interfaces de linha de comando do Python e a importância de analisar a entrada da linha de comando. Em seguida, discutiremos o módulo argparse e seus benefícios.
Visão geral das interfaces de linha de comando em Python
As interfaces de linha de comando são programas que são executados exclusivamente com base em comandos de texto. Os usuários inserem comandos em um terminal ou linha de comando, que normalmente incluem argumentos e opções que alteram o comportamento do programa. As CLIs são úteis porque são facilmente automatizadas e integradas a outras tecnologias.
No Python, uma CLI é criada com o desenvolvimento de um script que aceita entrada de linha de comando. Essa entrada geralmente é apresentada como uma lista de argumentos que o script pode acessar e interpretar. Para programas básicos, o tratamento manual desses argumentos por meio da lista sys.argv pode ser suficiente. Entretanto, quando a complexidade do programa aumenta, o processamento manual de argumentos se torna ineficiente e propenso a erros.
Importância da análise dos argumentos da linha de comando
A análise dos argumentos da linha de comando é necessária por vários motivos:
- Flexibilidade: Ao receber parâmetros, um programa pode executar várias tarefas ou atuar em diferentes conjuntos de dados sem alterar o código. Os usuários podem especificar arquivos para processar, definir configurações e selecionar modos de operação.
- Facilidade de uso: A análise adequada de argumentos permite que o programa exiba mensagens úteis, instrua o usuário sobre como usar o programa e trate as falhas com elegância.
- Mantenabilidade: O uso de um módulo de análise dedicado, como argparse, torna o código mais claro e fácil de manter. Ele separa a lógica usada para analisar os argumentos da operação principal do programa.
Introdução ao módulo argparse e seus benefícios
O módulo argparse
faz parte da biblioteca padrão do Python. Portanto, ele pode ser usado sem a necessidade de instalar nenhum pacote adicional. Ele oferece uma interface direta e consistente para analisar as entradas da linha de comando. Algumas das vantagens de utilizar o site argparse
são:
- Geração automática de ajuda: Ele gera mensagens de ajuda e de uso com base nos argumentos do código.
- Tratamento de erros: Ele exibe mensagens de erro úteis quando os usuários inserem argumentos inválidos.
- Conversão de tipo: Ele pode converter automaticamente as cadeias de parâmetros para o tipo de dados apropriado.
- Ele suporta argumentos posicionais necessários e argumentos opcionais com simplicidade.
- Valores padrão: Ele permite que você forneça valores padrão para parâmetros que o usuário não fornece.
O argparse permite que os desenvolvedores se concentrem na funcionalidade principal do programa e, ao mesmo tempo, dependam de uma base sólida para gerenciar a entrada da linha de comando.
Configuração do argparse e uso básico
Agora que abordamos a importância de analisar os argumentos da linha de comando e as vantagens de usar argparse
, vamos ver como você pode configurá-lo e usá-lo em um script Python.
Instalação e importação do argparse
Não é necessário instalar nada separadamente, pois o argparse
faz parte da biblioteca padrão do Python. Você pode importá-lo logo no início do script.
import argparse
Essa linha carrega o módulo argparse
no seu script, permitindo que você use sua funcionalidade para analisar os argumentos da linha de comando.
Criando um analisador de argumentos simples
A primeira etapa na utilização do site argparse
é gerar um objeto analisador. Esse objeto armazenará informações sobre os argumentos que seu programa aceita e analisará a entrada da linha de comando.
parser = argparse.ArgumentParser(description='Process some integers.')
Neste exemplo, criamos um objeto ArgumentParser()
e descrevemos o programa. Quando o usuário selecionar a opção de ajuda (-h
ou --help
), essa descrição será exibida.
Adição de argumentos posicionais e opcionais
Agora que desenvolvemos o analisador, podemos especificar os argumentos que nosso programa aceitará.
Adição de argumentos posicionais
Os argumentos posicionais são essenciais e devem ser apresentados em uma ordem precisa. Por exemplo, considere um script que adiciona dois números. Podemos definir dois argumentos posicionais para os números:
parser.add_argument('num1', type=int, help='The first number to add.')
parser.add_argument('num2', type=int, help='The second number to add.')
Neste código, num1
e num2
referem-se aos parâmetros posicionais.
type=int
indica que os parâmetros devem ser convertidos em números inteiros. O argumento help especifica uma descrição que será exibida na mensagem de ajuda.
Adicionar argumentos opcionais
Os argumentos opcionais não são necessários e normalmente fornecem opções adicionais ou alteram o comportamento do programa. Normalmente, eles são prefixados com um ou dois traços. Adicionaremos um argumento opcional para ativar a saída detalhada:
parser.add_argument('-v', '--verbose', action='store_true', help='Increase output verbosity.')
Aqui:
- A opção curta é
-v
(por exemplo,-v
).--verbose
é uma opção longa. action='store_true'
indica que, se a opção for selecionada, o atributo verbose será definido comoTrue
; caso contrário, seráFalse
.- O argumento
help
especifica uma descrição para a mensagem de ajuda.
Analisar argumentos e acessar seus valores
Depois de especificar todos os argumentos, precisamos analisar a entrada da linha de comando. Para isso, use o método .parse_args()
.
args = parser.parse_args()
Os parâmetros analisados agora são armazenados na variável args
como atributos. Podemos acessá-los usando a notação de ponto.
result = args.num1 + args.num2
print('The sum of {} and {} is {}'.format(args.num1, args.num2, result))
if args.verbose:
print('Verbose mode is enabled.')
Juntando tudo, aqui está um script completo que adiciona dois números e inclui um modo detalhado opcional:
import argparse
parser = argparse.ArgumentParser(description='Add two integers.')
parser.add_argument('num1', type=int, help='The first number to add.')
parser.add_argument('num2', type=int, help='The second number to add.')
parser.add_argument('-v', '--verbose', action='store_true', help='Increase output verbosity.')
args = parser.parse_args()
result = args.num1 + args.num2
print('The sum of {} and {} is {}'.format(args.num1, args.num2, result))
if args.verbose:
print('Calculation completed successfully.')
Você pode executar esse script na linha de comando e fornecer os argumentos posicionais necessários:
python add_numbers.py 3 5
The sum of 3 and 5 is 8
Se você incluir a opção -v
ou --verbose
, o script imprimirá a mensagem detalhada adicional:
python add_numbers.py 3 5 --verbose
The sum of 3 and 5 is 8
Calculation completed successfully.
Se o usuário executar o script com a opção -h
ou --help
, argparse
exibirá uma mensagem de ajuda gerada automaticamente:
python add_numbers.py -h
usage: add_numbers.py [-h] [-v] num1 num2
Add two integers.
positional arguments:
num1 The first number to add.
num2 The second number to add.
optional arguments:
-h, --help show this help message and exit
-v, --verbose Increase output verbosity.
Esse recurso torna seu programa mais fácil de usar, fornecendo instruções claras sobre como usá-lo.
Tratamento avançado de argumentos
Ao desenvolver programas de linha de comando em Python, você pode encontrar cenários que exijam uma análise de argumentos mais complexa. O módulo argparse
do Python inclui vários recursos para atender a esses requisitos complexos, permitindo que você desenvolva interfaces flexíveis e fáceis de usar.
Usando nargs para vários argumentos
Há situações em que seu aplicativo precisa aceitar vários valores para o mesmo argumento. Por exemplo, suponha que você queira criar um script que processe vários arquivos de uma só vez. O parâmetro nargs em argparse
permite que você especifique quantos argumentos de linha de comando devem ser lidos.
Veja como você pode usar o site nargs
para aceitar vários nomes de arquivos:
import argparse
parser = argparse.ArgumentParser(description='Process multiple files.')
parser.add_argument('filenames', nargs='+', help='List of files to process.')
args = parser.parse_args()
for filename in args.filenames:
print(f'Processing file: {filename}')
# Add your file processing code here
Nesse caso, nargs='+'
instrui o analisador a esperar um ou mais argumentos em nomes de arquivos. O usuário pode fornecer quantos nomes de arquivos forem necessários, e eles serão salvos em uma lista chamada args.filenames
.
Se você quiser aceitar uma determinada quantidade de argumentos, defina nargs
como esse número. Por exemplo, o site nargs=2
requer exatamente dois parâmetros.
Implementação de opções para limitar os valores dos argumentos
Às vezes, você deseja limitar um argumento a um intervalo específico de valores válidos. Isso garante que o usuário ofereça uma entrada válida, evitando assim erros ou ações inesperadas. O parâmetro options permite que você especifique os valores permitidos para um argumento.
Considere um script que executa várias atividades dependendo de um modo selecionado pelo usuário.
import argparse
parser = argparse.ArgumentParser(description='Perform actions in different modes.')
parser.add_argument('--mode', choices=['backup', 'restore', 'delete'], required=True, help='Mode of operation.')
args = parser.parse_args()
if args.mode == 'backup':
print('Backing up data...')
# Backup code here
elif args.mode == 'restore':
print('Restoring data...')
# Restore code here
elif args.mode == 'delete':
print('Deleting data...')
# Delete code here
Nesse script, o argumento --mode
deve ser uma das opções. Se o usuário inserir um valor que não esteja na lista, o site argparse
retornará uma mensagem de erro.
Manipulação de sinalizadores booleanos e alternadores
Os sinalizadores booleanos são opções que ativam ou desativam funcionalidades específicas em seu aplicativo. Normalmente, eles são definidos sem um valor, simplesmente incluindo o sinalizador no comando. Você pode manipular esses sinalizadores em argparse
com o parâmetro action
.
Por exemplo, vamos incluir um modo de depuração em um script:
import argparse
parser = argparse.ArgumentParser(description='A script with debug mode.')
parser.add_argument('--debug', action='store_true', help='Enable debug output.')
args = parser.parse_args()
if args.debug:
print('Debug mode is enabled.')
# Additional debug information here
else:
print('Debug mode is disabled.')
Ao usar action='store_true'
, o sinalizador --debug
definirá args.debug
para True
quando presente e False
caso contrário.
Definir valores padrão e argumentos necessários
Os argumentos opcionais frequentemente incluem valores padrão sensatos. Isso significa que, se o usuário não especificar o argumento, o aplicativo usará o padrão. O argumento default
permite que você especifique um valor padrão.
Aqui está um exemplo:
import argparse
parser = argparse.ArgumentParser(description='Adjust program settings.')
parser.add_argument('--timeout', type=int, default=30, help='Timeout in seconds.')
args = parser.parse_args()
print(f'Timeout is set to {args.timeout} seconds.')
Nesse cenário, se o usuário não especificar --timeout
, o padrão será 30 segundos.
Para tornar obrigatório um argumento opcional, set required=True
.
import argparse
parser = argparse.ArgumentParser(description='Send a message.')
parser.add_argument('--recipient', required=True, help='Recipient of the message.')
args = parser.parse_args()
print(f'Sending message to {args.recipient}.')
O script agora exigirá o argumento --recipient
.
Personalização da ajuda e das mensagens de erro
O fornecimento de mensagens claras e úteis aos usuários é um componente essencial do desenvolvimento de um programa de linha de comando eficaz. O módulo argparse
do Python cria automaticamente mensagens de ajuda, mas você pode modificar essas mensagens para atender melhor às suas necessidades.
Geração automática de mensagens de ajuda
Por padrão, o site argparse
gera uma mensagem de ajuda, que pode ser acessada usando as opções -h
ou --help
. Essa mensagem contém o uso do programa, uma descrição e informações sobre cada argumento.
Por exemplo:
import argparse
parser = argparse.ArgumentParser(description='Calculate factorial of a number.')
parser.add_argument('number', type=int, help='The number to calculate the factorial for.')
args = parser.parse_args()
Quando um usuário executar o script com -h
, ele verá:
usage: script.py [-h] number
Calculate factorial of a number.
positional arguments:
number The number to calculate the factorial for.
optional arguments:
-h, --help show this help message and exit
Essa mensagem de ajuda automática fornece informações úteis sem exigir nenhum esforço adicional.
Personalização das descrições da ajuda e das mensagens de uso
Embora as mensagens de ajuda padrão sejam úteis, você pode querer alterá-las para fornecer informações adicionais ou para se adequar a uma estrutura específica. Você pode alterar a descrição, o epílogo e o texto de uso no site ArgumentParser
.
Por exemplo, para incluir um epílogo e personalizar a mensagem de uso:
import argparse
parser = argparse.ArgumentParser(
description='Convert temperatures between Celsius and Fahrenheit.',
epilog='Enjoy using the temperature converter!',
usage='%(prog)s [options] temperature')
parser.add_argument('temperature', type=float, help='Temperature value to convert.')
parser.add_argument('--to-fahrenheit', action='store_true', help='Convert Celsius to Fahrenheit.')
parser.add_argument('--to-celsius', action='store_true', help='Convert Fahrenheit to Celsius.')
args = parser.parse_args()
Agora, quando o usuário verificar a mensagem de ajuda, ela incluirá a descrição personalizada, o uso e o epílogo:
python file.py --help
usage: p.py [options] temperature
Convert temperatures between Celsius and Fahrenheit.
positional arguments:
temperature Temperature value to convert.
options:
-h, --help show this help message and exit
--to-fahrenheit Convert Celsius to Fahrenheit.
--to-celsius Convert Fahrenheit to Celsius.
Gerenciar o tratamento de erros e o feedback do usuário
Se um usuário inserir argumentos inválidos, o site argparse
exibirá uma mensagem de erro e encerrará o programa. Você pode modificar esse comportamento para fornecer feedback mais útil ou para tratar as falhas de forma diferente.
Uma abordagem é substituir o método de erro em uma subclasse de ArgumentParser
:
import argparse
import sys
class CustomArgumentParser(argparse.ArgumentParser):
def error(self, message):
print(f'Error: {message}')
self.print_help()
sys.exit(2)
parser = CustomArgumentParser(description='Divide two numbers.')
parser.add_argument('numerator', type=float, help='The numerator.')
parser.add_argument('denominator', type=float, help='The denominator.')
args = parser.parse_args()
if args.denominator == 0:
parser.error('Denominator cannot be zero.')
result = args.numerator / args.denominator
print(f'Result: {result}')
Se o usuário tentar dividir por zero nesse script, o aplicativo exibirá um aviso de erro e um texto de ajuda, orientando o usuário a fornecer dados válidos.
Python file.py 6 0
Error: Denominator cannot be zero.
usage: file.py [-h] numerator denominator
Divide two numbers.
positional arguments:
numerator The numerator.
denominator The denominator.
options:
-h, --help show this help message and exit
Você também pode incluir o tratamento de erros personalizado em seu script. Por exemplo, para gerenciar caminhos de arquivos inválidos:
import argparse
import os
parser = argparse.ArgumentParser(description='Read a file and display its contents.')
parser.add_argument('filepath', help='Path to the file.')
args = parser.parse_args()
if not os.path.exists(args.filepath):
parser.error(f"The file {args.filepath} does not exist.")
with open(args.filepath, 'r') as file:
contents = file.read()
print(contents)
Ao executar o script com um caminho inválido, você verá o erro abaixo:
python app..py file
usage: p.py [-h] filepath
app.py: error: The file file does not exist.
Exemplos do mundo real e casos de uso
Se você entender como usar o módulo argparse
em configurações do mundo real, sua funcionalidade ficará mais clara. Vejamos alguns exemplos de como você pode usar o argparse
em aplicativos do mundo real.
Criando uma calculadora de linha de comando
Suponha que você precise desenvolver uma calculadora simples que possa fazer operações aritméticas básicas a partir da linha de comando. Essa calculadora deve aceitar dois números e um operador para executar o cálculo solicitado.
Veja a seguir como você deve abordar essa tarefa:
import argparse
parser = argparse.ArgumentParser(description='Simple command-line calculator.')
parser.add_argument('num1', type=float, help='First number.')
parser.add_argument('operator', choices=['+', '-', '*', '/'], help='Operation to perform.')
parser.add_argument('num2', type=float, help='Second number.')
args = parser.parse_args()
if args.operator == '+':
result = args.num1 + args.num2
elif args.operator == '-':
result = args.num1 - args.num2
elif args.operator == '*':
result = args.num1 * args.num2
elif args.operator == '/':
if args.num2 == 0:
print('Error: Division by zero is not allowed.')
exit(1)
result = args.num1 / args.num2
print(f'The result is: {result}')
Nesse script, o módulo argparse
é usado para definir três argumentos posicionais: dois números e um operador. O argumento choices
limita o operador a símbolos aritméticos válidos. Quando o usuário executa o script, ele pode realizar esses cálculos:
python calculator.py 10 + 5
The result is: 15.0
Essa calculadora básica mostra como as opções de linha de comando podem aumentar a flexibilidade e a interatividade de um programa.
Criando um script de processamento de arquivos com várias opções
Suponha que você precise de um script que processe arquivos de texto e ofereça opções como designar um arquivo de saída, selecionar um modo de processamento e ativar a saída detalhada.
Aqui está um exemplo de como você poderia configurá-lo:
import argparse
parser = argparse.ArgumentParser(description='Process text files.')
parser.add_argument('input_file', help='Path to the input file.')
parser.add_argument('-o', '--output', help='Path to the output file.')
parser.add_argument('-m', '--mode', choices=['uppercase', 'lowercase'], default='uppercase', help='Processing mode.')
parser.add_argument('-v', '--verbose', action='store_true', help='Enable verbose output.')
args = parser.parse_args()
# Read the input file
with open(args.input_file, 'r') as file:
content = file.read()
if args.verbose:
print(f'Reading from {args.input_file}')
# Process the content
if args.mode == 'uppercase':
processed_content = content.upper()
else:
processed_content = content.lower()
if args.verbose:
print('Processing content')
# Write to the output file or print to console
if args.output:
with open(args.output, 'w') as file:
file.write(processed_content)
if args.verbose:
print(f'Writing output to {args.output}')
else:
print(processed_content)
Esse script aceita um arquivo de entrada e tem opções para o arquivo de saída, o modo de processamento e a saída detalhada. Os usuários podem modificar o comportamento do script sem alterar o código.
python text_processor.py input.txt -o output.txt --mode lowercase -v
Reading from input.txt
Processing content
Writing output to output.txt
Desenvolvimento de uma ferramenta CLI com subcomandos
Em aplicativos mais complicados, podem ser necessários subcomandos, de modo semelhante ao funcionamento do git, que usa comandos como git commit e git push. O módulo argparse
fornece subparsers para essa finalidade.
Veja como você pode criar uma ferramenta CLI com subcomandos:
import argparse
parser = argparse.ArgumentParser(description='Manage tasks.')
subparsers = parser.add_subparsers(dest='command', required=True)
# Subcommand 'add'
parser_add = subparsers.add_parser('add', help='Add a new task.')
parser_add.add_argument('name', help='Name of the task.')
parser_add.add_argument('-p', '--priority', type=int, choices=range(1, 6), default=3, help='Priority of the task.')
# Subcommand 'list'
parser_list = subparsers.add_parser('list', help='List all tasks.')
parser_list.add_argument('-a', '--all', action='store_true', help='List all tasks, including completed ones.')
# Subcommand 'complete'
parser_complete = subparsers.add_parser('complete', help='Mark a task as completed.')
parser_complete.add_argument('task_id', type=int, help='ID of the task to complete.')
args = parser.parse_args()
if args.command == 'add':
print(f"Adding task '{args.name}' with priority {args.priority}")
# Code to add the task
elif args.command == 'list':
print('Listing tasks')
if args.all:
print('Including completed tasks')
# Code to list tasks
elif args.command == 'complete':
print(f'Marking task {args.task_id} as completed')
# Code to complete the task
Neste exemplo, o script tem três subcomandos: add
, list
, e complete
. Cada subcomando tem seus argumentos. Quando os usuários executam o script, eles inserem o subcomando e quaisquer outros parâmetros.
Por exemplo:
python task_manager.py add "Write report" -p 2
Adding task 'Write report' with priority 2
Tarefas de listagem
python task_manager.py list
Listing tasks
Marcação de tarefas como concluídas:
python task_manager.py complete 3
Marking task 3 as completed
subparsers
permitem que você crie ferramentas de linha de comando complexas que são bem organizadas e fáceis de estender, permitindo que você crie aplicativos que podem fazer várias coisas em uma única interface.
Práticas recomendadas e dicas do Python argparse
O desenvolvimento de programas de linha de comando envolve mais do que simplesmente escrever um código que funcione. Isso também envolve escrever um código limpo, de fácil manutenção e de fácil utilização.
Aqui estão algumas práticas recomendadas para você trabalhar com o módulo argparse
.
Organização do código para facilitar a leitura e a manutenção
Quando seus scripts se tornam mais complexos, é fundamental manter o código organizado para melhor compreensão e manutenção. Uma abordagem para fazer isso é usar funções e classes para organizar seções distintas do seu código.
Dividir o programa em partes menores e reutilizáveis facilita o gerenciamento e elimina a duplicação de código.
Por exemplo, em um script de gerenciamento de tarefas, você pode definir diferentes funções para adicionar tarefas, listar tarefas e concluir tarefas. Essa divisão permite que você se concentre em um aspecto da lógica de cada vez, tornando seu código mais claro.
Outra técnica eficaz é separar a lógica de análise de argumentos do restante do código. Colocar todas as definições e análises de argumentos no início do script ou em uma função dedicada facilita a compreensão de como o programa lida com a entrada.
O uso de nomes de variáveis apropriados também melhora a legibilidade. Escolha nomes de variáveis que reflitam a finalidade delas, para que qualquer pessoa que visualize seu código possa entender o que está acontecendo. Incluir comentários e docstrings
para explicar o que as funções fazem e quaisquer detalhes importantes pode ajudar a aumentar a compreensão.
Teste e depuração de aplicativos de linha de comando
Testar seus aplicativos é fundamental para garantir que eles funcionem corretamente e para detectar falhas logo no início. Escrever testes unitários com estruturas de teste Python, como unittest
ou pytest
, é uma excelente abordagem para testar seu código. Esses testes permitem que você imite várias entradas e garanta que suas funções funcionem corretamente.
Por exemplo, você pode testar vários cenários simulando as entradas da linha de comando em vez de executar o script a partir da linha de comando. Essa estratégia permite que você garanta que a análise de argumentos funcione conforme o esperado e que o aplicativo lide corretamente com vários cenários.
O tratamento de exceções com elegância também é fundamental. Usando os blocos try-except
, você pode detectar erros e enviar mensagens úteis ao usuário. Isso torna seu aplicativo mais estável e fácil de usar.
Considere também incluir um sinalizador de depuração em seu script. Esse sinalizador pode ativar uma saída adicional que permite que você acompanhe a execução do programa quando algo dá errado. Com essa opção, fica mais fácil diagnosticar problemas durante o desenvolvimento e a manutenção.
Comparando argparse com outras bibliotecas de análise de argumentos
Embora o argparse
seja um utilitário valioso na biblioteca padrão do Python, há outras bibliotecas disponíveis que fornecem métodos alternativos para analisar os argumentos da linha de comando. A compreensão dessas opções ajudará você a selecionar a ferramenta certa para o seu projeto.
Uma dessas bibliotecas é a Click. O Click é um pacote de terceiros para criar interfaces de linha de comando com decoradores. Ele tem uma sintaxe mais intuitiva e é ideal para aplicativos sofisticados. Por exemplo, você pode usar decoradores Python para criar comandos e opções, tornando seu código mais compacto e compreensível.
Docopt é outra opção que permite que você defina sua interface de linha de comando usando a docstring do programa. O Docopt analisa automaticamente a mensagem de ajuda e constrói o analisador de argumentos quando as instruções de uso são incluídas na docstring. Essa abordagem é elegante e adequada para scripts simples que exigem uma especificação mais legível por humanos.
Ao escolher a biblioteca que você vai utilizar, pense nas exigências do seu projeto. Se você deseja eliminar dependências externas e quer uma ferramenta que possa lidar com a maioria das circunstâncias, o argparse é uma excelente solução. Se você quiser uma sintaxe mais intuitiva e estiver trabalhando em um aplicativo complexo, o Click pode ser mais adequado. O Docopt é uma boa opção para programas pequenos com interfaces simples.
Conclusão
Ao longo deste artigo, vimos como usar o módulo Python argparse
para desenvolver programas de linha de comando em Python. Trabalhando com exemplos do mundo real, aprendemos a criar scripts realistas que recebem informações do usuário e realizam tarefas relevantes.
Desde a criação de uma calculadora básica até o desenvolvimento de uma ferramenta de gerenciamento de tarefas com subcomandos, o módulo argparse
oferece a versatilidade necessária para lidar com uma ampla gama de circunstâncias. Você pode criar aplicativos confiáveis e simples de manter aderindo às práticas recomendadas, como organização de código, testes abrangentes e consideração de bibliotecas alternativas.
Se você estiver automatizando atividades, analisando dados ou criando ferramentas complicadas, entender a análise de argumentos de linha de comando melhora sua capacidade de criar programas Python eficazes. Aumente seu conhecimento de Python hoje mesmo com nosso curso de habilidades Python Fundamentals.
Perguntas frequentes sobre o Python argparse
Como posso tornar um argumento opcional obrigatório no argparse?
Os argumentos opcionais em argparse normalmente não são necessários porque são, por definição, opcionais. No entanto, pode haver casos em que você queira que um argumento que comece com -- seja obrigatório. Para fazer isso, defina o parâmetro obrigatório como True
ao adicionar o argumento.
Veja como você pode fazer isso:
import argparse
parser = argparse.ArgumentParser(description='Process some data.')
parser.add_argument('--input', required=True, help='Path to the input file.')
args = parser.parse_args()
print(f'Input file: {args.input}')
Como faço para lidar com argumentos mutuamente exclusivos com argparse?
Às vezes, você pode encontrar argumentos que não devem ser usados juntos. Por exemplo, um script pode usar --verboseou --quiet, mas não os dois ao mesmo tempo. Para lidar com esse cenário,o argparse oferece suporte à definição de grupos mutuamente exclusivos.
Aqui está como você pode configurá-lo:
import argparse
parser = argparse.ArgumentParser(description='Process some data.')
group = parser.add_mutually_exclusive_group()
group.add_argument('--verbose', action='store_true', help='Enable verbose output.')
group.add_argument('--quiet', action='store_true', help='Enable quiet mode.')
args = parser.parse_args()
if args.verbose:
print('Verbose mode is on.')
elif args.quiet:
print('Quiet mode is on.')
else:
print('Default mode is on.')
Esse script permite que o usuário ative o modo verboso ou silencioso, mas não ambos. Se você tentar utilizar as duas opções simultaneamente, osite argparse emitirá um erro.
Como posso usar o argparse para ler argumentos de um arquivo em vez da linha de comando?
Embora o argparse seja destinado à análise de argumentos de linha de comando, você pode querer lê-los de um arquivo. Você pode fazer isso lendo os argumentos do arquivo e fornecendo-os ao método parse_args()
por meio do parâmetroargs.
Aqui está um exemplo.
import argparse
parser = argparse.ArgumentParser(description='Process some data.')
parser.add_argument('--input', help='Path to the input file.')
parser.add_argument('--output', help='Path to the output file.')
# Read arguments from a file
with open('args.txt', 'r') as file:
file_args = file.read().split()
args = parser.parse_args(file_args)
print(f'Input file: {args.input}')
print(f'Output file: {args.output}')
Nesse caso, o arquivo args.txt pode conter:
--input data/input.txt --output data/output.txt
O script lê os parâmetros do arquivo, converte-os em uma lista e os fornece a parse_args(). Isso permite que você gerencie seus argumentos em um arquivo em vez de inseri-los todas as vezes.
Como faço para personalizar a mensagem de ajuda no argparse para mostrar os valores padrão?
Por padrão, argparse não exibe os valores padrão dos parâmetros na mensagem de ajuda. Se você quiser incluir valores padrão no texto da ajuda, altere o parâmetro de ajuda ou use o parâmetro ArgumentDefaultsHelpFormatter.
Veja como você pode adicionar valores padrão à mensagem de ajuda:
import argparse
parser = argparse.ArgumentParser(
description='Process some data.',
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('--timeout', type=int, default=60, help='Timeout in seconds.')
args = parser.parse_args()
print(f'Timeout is set to {args.timeout} seconds.')
Com o ArgumentDefaultsHelpFormatter, a mensagem de ajuda exibirá o valor padrão do argumento --timeout:
usage: script.py [-h] [--timeout TIMEOUT]
Process some data.
optional arguments:
-h, --help show this help message and exit
--timeout TIMEOUT Timeout in seconds. (default: 60)
Isso fornece aos usuários mais informações sobre as configurações padrão do seu programa.
Quais são as práticas recomendadas para testar aplicativos de linha de comando que usam argparse?
Testar aplicativos de linha de comando pode ser difícil, mas existem métodos para facilitar esse processo. Uma maneira útil é replicar os argumentos da linha de comando usando o módulo unittest.
Aqui está um exemplo de como você pode testar um script usando argparse:
import unittest
import argparse
import sys
def create_parser():
parser = argparse.ArgumentParser(description='Process some data.')
parser.add_argument('--number', type=int, help='A number.')
return parser
def main(args):
parser = create_parser()
parsed_args = parser.parse_args(args)
if parsed_args.number is None:
parser.error('No number provided.')
result = parsed_args.number * 2
return result
class TestMain(unittest.TestCase):
def test_main_with_number(self):
test_args = ['--number', '5']
result = main(test_args)
self.assertEqual(result, 10)
def test_main_without_number(self):
test_args = []
with self.assertRaises(SystemExit):
main(test_args)
if __name__ == '__main__':
unittest.main()
No script de teste:
- A função .create_parser() inicializa o analisador de argumentos.
- O método main() processa os argumentos e executa a lógica principal.
- O teste TestMain oferece métodos de teste para simular várias entradas de linha de comando.
- Os testes garantem que o programa responda conforme o esperado a diversas entradas.
Estruture seu código para separar o processamento de argumentos e a lógica primária, facilitando o teste de diferentes áreas do programa.

blog
6 práticas recomendadas de Python para um código melhor

blog
Como aprender Python do zero em 2024: um guia especializado
blog