Padroneggia il modulo argparse di Python: crea CLI migliori
Impara a creare interfacce a riga di comando efficaci in Python usando il modulo argparse. Questa guida ti accompagna tra funzionalità di base e avanzate, con esempi pratici e consigli per migliorare le tue abilità di programmazione.
Python è un linguaggio di programmazione potente che permette agli sviluppatori di creare una varietà di applicazioni, dai semplici script a grandi sistemi software. Uno dei compiti più comuni è creare interfacce a riga di comando (CLI), che consentono agli utenti di interagire con i programmi tramite un terminale o la riga di comando. Le CLI sono essenziali per scripting, automazione e in tutti quei casi in cui un'interfaccia grafica è poco pratica.
La gestione dei parametri passati da riga di comando è una parte importante della progettazione di CLI. Questi argomenti consentono agli utenti di influenzare il comportamento di un programma fornendo parametri di input durante l'esecuzione. Senza la capacità di interpretare questi fattori, i programmi sarebbero meno versatili e più difficili da adattare a compiti specifici.
Python offre diversi moduli per la parsificazione degli argomenti da riga di comando, ma il modulo argparse spicca per semplicità e completezza. Il modulo argparse rende facile sviluppare interfacce a riga di comando funzionali. Gestisce automaticamente il parsing dei parametri, mostra istruzioni utili e segnala errori quando gli utenti forniscono informazioni errate.
In questo tutorial vedremo come usare il pacchetto Pythonargparse. Partiremo con una panoramica delle interfacce a riga di comando in Python e dell'importanza di analizzare l'input da riga di comando. Poi discuteremo il modulo argparse e i suoi vantaggi.
Panoramica delle interfacce a riga di comando in Python
Le interfacce a riga di comando sono programmi che funzionano esclusivamente con comandi testuali. Gli utenti inseriscono comandi in un terminale o nella riga di comando, che in genere includono argomenti e opzioni che modificano il comportamento del programma. Le CLI sono utili perché sono facilmente automatizzabili e integrabili con altre tecnologie.
In Python, una CLI si crea sviluppando uno script che accetta input da riga di comando. Questo input di solito è presentato come un elenco di argomenti a cui lo script può accedere e che può interpretare. Per i programmi di base, gestire manualmente questi argomenti tramite l'elenco sys.argv può essere sufficiente. Tuttavia, quando la complessità del programma aumenta, elaborare manualmente gli argomenti diventa inefficiente e soggetto a errori.
Importanza del parsing degli argomenti da riga di comando
Analizzare gli argomenti da riga di comando è necessario per numerosi motivi:
Flessibilità: accettando parametri, un programma può svolgere più compiti o agire su insiemi di dati diversi senza cambiare il codice. Gli utenti possono specificare i file da elaborare, configurare impostazioni e scegliere le modalità operative.
Facilità d'uso: un parsing corretto degli argomenti consente al programma di mostrare messaggi utili, spiegare come usarlo e gestire gli errori con grazia.
Manutenibilità: usare un modulo dedicato al parsing, come argparse, rende il tuo codice più chiaro e facile da mantenere. Separa la logica usata per analizzare gli argomenti dal funzionamento principale del programma.
Introduzione al modulo argparse e ai suoi vantaggi
Il modulo argparse fa parte della libreria standard di Python. Quindi può essere usato senza installare pacchetti aggiuntivi. Offre un'interfaccia semplice e coerente per analizzare gli input da riga di comando. Alcuni dei vantaggi dell'utilizzo di argparse sono:
Generazione automatica dell'aiuto: genera messaggi di aiuto e di utilizzo in base agli argomenti definiti nel codice.
Gestione degli errori: mostra messaggi di errore utili quando gli utenti inseriscono argomenti non validi.
Conversione dei tipi: può convertire automaticamente le stringhe dei parametri nel tipo di dato appropriato.
Supporta sia gli argomenti posizionali obbligatori sia quelli opzionali con semplicità.
Valori predefiniti: ti consente di fornire valori di default per i parametri non specificati dall'utente.
argparse permette agli sviluppatori di concentrarsi sulla funzionalità principale del programma, contando su solide basi per la gestione dell'input da riga di comando.
Configurare argparse e utilizzo di base
Ora che abbiamo visto l'importanza del parsing degli argomenti da riga di comando e i vantaggi di usare argparse, vediamo come configurarlo e utilizzarlo in uno script Python.
Installare e importare argparse
Non serve installare nulla separatamente perché argparse fa parte della libreria standard di Python. Puoi importarlo all'inizio del tuo script.
Questa riga carica il modulo argparse nel tuo script, consentendoti di usarne le funzionalità per analizzare gli argomenti da riga di comando.
Creare un semplice parser di argomenti
Il primo passo per utilizzare argparse è generare un oggetto parser. Questo oggetto memorizzerà le informazioni sugli argomenti accettati dal programma e analizzerà l'input da riga di comando.
parser = argparse.ArgumentParser(description='Process some integers.')Offerto da
In questo esempio creiamo un oggetto ArgumentParser() e descriviamo il programma. Quando l'utente seleziona l'opzione di aiuto (-h o --help), verrà mostrata questa descrizione.
Aggiungere argomenti posizionali e opzionali
Ora che abbiamo creato il parser, possiamo specificare gli argomenti che il nostro programma accetterà.
Aggiungere argomenti posizionali
Gli argomenti posizionali sono essenziali e devono essere forniti in un ordine preciso. Ad esempio, considera uno script che somma due numeri. Possiamo definire due argomenti posizionali per i numeri:
parser.add_argument('num1',type=int,help='The first number to add.')
parser.add_argument('num2',type=int,help='The second number to add.')Offerto da
In questo codice, num1 e num2 si riferiscono ai parametri posizionali.
type=int indica che i parametri devono essere convertiti in interi. L'argomento help specifica una descrizione che apparirà nel messaggio di aiuto.
Aggiungere argomenti opzionali
Gli argomenti opzionali non sono necessari e di solito forniscono opzioni aggiuntive o modificano il comportamento del programma. Sono in genere preceduti da uno o due trattini. Aggiungiamo un argomento opzionale per abilitare l'output dettagliato:
parser.add_argument('-v','--verbose', action='store_true',help='Increase output verbosity.')Offerto da
Qui:
L'opzione breve è -v (per esempio, -v). --verbose è l'opzione estesa.
action='store_true' indica che, se l'opzione è selezionata, l'attributo verbose sarà impostato su True; altrimenti sarà False.
L'argomento help specifica una descrizione per il messaggio di aiuto.
Analizzare gli argomenti e accedere ai loro valori
Dopo aver specificato tutti gli argomenti, dobbiamo analizzare l'input della riga di comando. Usa il metodo .parse_args() per farlo.
I parametri analizzati sono ora memorizzati nella variabile args come attributi. Possiamo accedervi usando la dot notation.
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.')Offerto da
Mettendo tutto insieme, ecco uno script completo che somma due numeri e include una modalità dettagliata opzionale:
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.')Offerto da
Puoi eseguire questo script dalla riga di comando e fornire gli argomenti posizionali richiesti:
python add_numbers.py 35
The sum of 3 and 5 is 8Offerto da
Se includi l'opzione -v o --verbose, lo script stamperà il messaggio aggiuntivo in modalità dettagliata:
python add_numbers.py 35--verbose
The sum of 3 and 5 is 8
Calculation completed successfully.Offerto da
Se l'utente esegue lo script con l'opzione -h o --help, argparse mostrerà un messaggio di aiuto generato 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.Offerto da
Questa funzionalità rende il tuo programma più facile da usare fornendo istruzioni chiare su come utilizzarlo.
Gestione avanzata degli argomenti
Quando sviluppi programmi da riga di comando in Python, potresti imbatterti in scenari che richiedono un parsing degli argomenti più complesso. Il modulo argparse di Python include diverse funzionalità per soddisfare queste esigenze, consentendoti di sviluppare interfacce flessibili e intuitive.
Usare nargs per più argomenti
Ci sono situazioni in cui l'applicazione deve accettare numerosi valori per lo stesso argomento. Per esempio, supponi di voler creare uno script che elabori più file contemporaneamente. Il parametro nargs in argparse ti consente di specificare quanti argomenti da riga di comando devono essere letti.
Ecco come usare nargs per accettare più nomi di file:
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 hereOfferto da
In questo caso, nargs='+' indica al parser di aspettarsi uno o più argomenti in filenames. L'utente può fornire quanti nomi di file desidera, e verranno salvati in un elenco chiamato args.filenames.
Se vuoi accettare un numero preciso di argomenti, imposta nargs su quel numero. Ad esempio, nargs=2 richiede esattamente due parametri.
Implementare choices per limitare i valori degli argomenti
A volte vuoi limitare un argomento a un insieme specifico di valori validi. Questo garantisce che l'utente fornisca input validi, evitando errori o comportamenti imprevisti. Il parametro choices ti permette di specificare i valori consentiti per un argomento.
Considera uno script che esegue diverse attività a seconda di una modalità selezionata dall'utente.
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 hereelif args.mode =='restore':print('Restoring data...')# Restore code hereelif args.mode =='delete':print('Deleting data...')# Delete code hereOfferto da
In questo script, l'argomento --mode deve essere uno dei valori indicati. Se l'utente inserisce un valore non presente nell'elenco, argparse restituirà un messaggio di errore.
Gestire flag booleani e interruttori
I flag booleani sono opzioni che abilitano o disabilitano funzionalità specifiche nell'applicazione. In genere sono definiti senza un valore: basta includere il flag nel comando. Puoi gestire questi flag in argparse con il parametro action.
Per esempio, aggiungiamo una modalità di debug a uno 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 hereelse:print('Debug mode is disabled.')Offerto da
Usando action='store_true', il flag --debug imposterà args.debug a True quando presente e a False altrimenti.
Impostare valori predefiniti e argomenti obbligatori
Gli argomenti opzionali spesso includono valori predefiniti sensati. Questo significa che, se l'utente non specifica l'argomento, l'applicazione userà il valore di default. L'argomento default ti consente di specificare un valore predefinito.
Ecco un esempio:
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.')Offerto da
In questo scenario, se l'utente non specifica --timeout, il valore predefinito è 30 secondi.
Per rendere obbligatorio un argomento opzionale, imposta 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}.')Offerto da
Ora lo script richiederà l'argomento --recipient.
Personalizzare messaggi di aiuto ed errori
Fornire messaggi chiari e utili agli utenti è un elemento essenziale nello sviluppo di un programma a riga di comando efficace. Il modulo argparse di Python crea automaticamente i messaggi di aiuto, ma puoi modificarli per adattarli meglio alle tue esigenze.
Generare messaggi di aiuto automatici
Per impostazione predefinita, argparse genera un messaggio di aiuto, accessibile con le opzioni -h o --help. Questo messaggio contiene l'utilizzo del programma, una descrizione e le informazioni su ciascun argomento.
Per esempio:
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()Offerto da
Quando un utente esegue lo script con -h, vedrà:
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 exitOfferto da
Questo messaggio di aiuto automatico fornisce informazioni utili senza richiedere sforzi aggiuntivi.
Personalizzare descrizioni e messaggi di utilizzo
Sebbene i messaggi di aiuto predefiniti siano utili, potresti volerli modificare per fornire informazioni aggiuntive o per seguire una struttura specifica. Puoi cambiare description, epilog e usage nel ArgumentParser.
Per esempio, per includere un epilog e personalizzare il messaggio di utilizzo:
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()Offerto da
Ora, quando l'utente consulta il messaggio di aiuto, includerà la descrizione, l'uso e l'epilog personalizzati:
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.
Offerto da
Gestire la gestione degli errori e il feedback all'utente
Se un utente inserisce argomenti non validi, argparse mostrerà un messaggio di errore e terminerà il programma. Puoi modificare questo comportamento per fornire feedback più utile o per gestire gli errori in modo diverso.
Un approccio è sovrascrivere il metodo error in una sottoclasse di ArgumentParser:
import argparse
import sys
classCustomArgumentParser(argparse.ArgumentParser):deferror(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}')Offerto da
Se l'utente tenta di dividere per zero in questo script, l'applicazione mostrerà un avviso di errore e il testo di aiuto, indirizzando l'utente a fornire dati validi.
Python file.py 60
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 exitOfferto da
Puoi anche includere una gestione personalizzata degli errori nel tuo script. Ad esempio, per gestire percorsi di file non validi:
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()ifnot os.path.exists(args.filepath):
parser.error(f"The file {args.filepath} does not exist.")withopen(args.filepath,'r')asfile:
contents =file.read()print(contents)Offerto da
Eseguire lo script con un percorso non valido mostrerà l'errore seguente:
python app..py file
usage: p.py [-h] filepath
app.py: error: The filefile does not exist.Offerto da
Esempi reali e casi d'uso
Capire come usare il modulo argparse in contesti reali ne chiarirà ulteriormente la funzionalità. Vediamo alcuni esempi di utilizzo di argparse in applicazioni pratiche.
Creare una calcolatrice da riga di comando
Supponi di dover sviluppare una semplice calcolatrice che esegua operazioni aritmetiche di base dalla riga di comando. Questa calcolatrice dovrebbe accettare due numeri e un operatore per eseguire il calcolo richiesto.
Ecco come affrontare questo compito:
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}')Offerto da
In questo script, il modulo argparse è usato per definire tre argomenti posizionali: due numeri e un operatore. L'argomento choices limita l'operatore a simboli aritmetici validi. Quando l'utente esegue lo script, può effettuare questi calcoli:
python calculator.py 10 + 5
The result is: 15.0Offerto da
Questa calcolatrice di base mostra come le opzioni da riga di comando possano aumentare la flessibilità e l'interattività di un programma.
Creare uno script di elaborazione file con più opzioni
Supponi ti serva uno script che elabori file di testo e fornisca opzioni come la definizione di un file di output, la selezione di una modalità di elaborazione e l'abilitazione dell'output dettagliato.
Ecco un esempio di configurazione:
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 filewithopen(args.input_file,'r')asfile:
content =file.read()if args.verbose:print(f'Reading from {args.input_file}')# Process the contentif 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 consoleif args.output:withopen(args.output,'w')asfile:file.write(processed_content)if args.verbose:print(f'Writing output to {args.output}')else:print(processed_content)Offerto da
Questo script accetta un file di input e offre opzioni per il file di output, la modalità di elaborazione e l'output dettagliato. Gli utenti possono modificare il comportamento dello script senza alterare il codice.
python text_processor.py input.txt -o output.txt --mode lowercase -v
Reading frominput.txt
Processing content
Writing output to output.txtOfferto da
Sviluppare uno strumento CLI con sottocomandi
In applicazioni più complesse, possono servire dei sottocomandi, in modo simile a come git funziona con comandi come git commit e git push. Il modulo argparse fornisce subparsers per questo scopo.
Ecco come creare uno strumento CLI con sottocomandi:
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 taskelif args.command =='list':print('Listing tasks')if args.all:print('Including completed tasks')# Code to list taskselif args.command =='complete':print(f'Marking task {args.task_id} as completed')# Code to complete the taskOfferto da
In questo esempio, lo script ha tre sottocomandi: add, list e complete. Ogni sottocomando ha i propri argomenti. Quando gli utenti eseguono lo script, inseriscono il sottocomando e gli eventuali altri parametri.
Per esempio:
python task_manager.py add"Write report"-p2
Adding task 'Write report' with priority 2Offerto da
Elencare le attività
python task_manager.py list
Listing tasksOfferto da
Contrassegnare le attività come completate:
python task_manager.py complete 3
Marking task 3 as completedOfferto da
subparsers ti permettono di creare strumenti da riga di comando complessi, ben organizzati e facili da estendere, consentendoti di costruire applicazioni che possono svolgere più funzioni in un'unica interfaccia.
Best practice e consigli per Python argparse
Sviluppare programmi da riga di comando non significa solo scrivere codice che funziona. Vuol dire anche scrivere codice pulito, manutenibile e facile da usare.
Ecco alcune best practice quando lavori con il modulo argparse.
Organizzare il codice per leggibilità e manutenzione
Quando gli script diventano più complessi, è fondamentale mantenere il codice organizzato per migliorarne la comprensione e la manutenzione. Un modo per riuscirci è usare funzioni e classi per strutturare le diverse parti del codice.
Suddividere il programma in parti più piccole e riutilizzabili lo rende più gestibile ed elimina duplicazioni di codice.
Per esempio, in uno script di gestione attività, potresti definire funzioni diverse per aggiungere attività, elencarle e completarle. Questa divisione ti permette di concentrarti su un aspetto della logica alla volta, rendendo il codice più chiaro.
Un'altra tecnica efficace è separare la logica di parsing degli argomenti dal resto del codice. Inserire tutte le definizioni degli argomenti e il parsing all'inizio dello script, o in una funzione dedicata, facilita a chi legge la comprensione di come il programma gestisca l'input.
Usare nomi di variabili appropriati migliora anche la leggibilità. Scegli nomi che riflettano lo scopo, così chiunque legga il codice può capire cosa sta succedendo. Includere commenti e docstring per spiegare cosa fanno le funzioni e i dettagli chiave può contribuire ad aumentare la comprensione.
Test e debug di applicazioni da riga di comando
Testare le applicazioni è fondamentale per assicurarsi che funzionino correttamente e per individuare i problemi in anticipo. Scrivere unit test con framework come unittest o pytest è un ottimo modo per testare il codice. Questi test ti permettono di simulare vari input e verificare che le funzioni lavorino correttamente.
Ad esempio, puoi testare diversi scenari simulando gli input della riga di comando invece di eseguire lo script dal terminale. Questa strategia ti consente di assicurarti che il parsing degli argomenti funzioni come previsto e che l'applicazione gestisca correttamente vari casi.
Gestire le eccezioni con grazia è altrettanto importante. Usando blocchi try-except puoi intercettare gli errori e fornire messaggi utili all'utente. Questo rende la tua applicazione più stabile e facile da usare.
Valuta anche di includere un flag di debug nello script. Questo flag può abilitare un output aggiuntivo che ti aiuta a tracciare l'esecuzione del programma quando qualcosa non va. Avere questa opzione rende più semplice diagnosticare i problemi durante sviluppo e manutenzione.
Confrontare argparse con altre librerie di parsing degli argomenti
Sebbene argparse sia un'utilità preziosa nella libreria standard di Python, esistono altre librerie che offrono metodi alternativi per analizzare gli argomenti da riga di comando. Conoscere queste opzioni ti aiuta a scegliere lo strumento giusto per il tuo progetto.
Una di queste librerie è Click. Click è un pacchetto di terze parti per creare interfacce a riga di comando con i decorator. Ha una sintassi più intuitiva ed è ideale per applicazioni sofisticate. Per esempio, puoi usare i decorator in Python per creare comandi e opzioni, rendendo il codice più compatto e leggibile.
Docopt è un'altra opzione che ti permette di definire la tua interfaccia a riga di comando usando la docstring del programma. Docopt analizza automaticamente il messaggio di aiuto e costruisce il parser degli argomenti quando le istruzioni di utilizzo sono incluse nella docstring. Questo approccio è elegante e adatto a script semplici che richiedono una specifica più leggibile.
Quando scegli quale libreria utilizzare, pensa alle esigenze del tuo progetto. Se vuoi evitare dipendenze esterne e desideri uno strumento che copra la maggior parte dei casi, argparse è un'ottima soluzione. Se vuoi una sintassi più intuitiva e stai lavorando a un'applicazione complessa, Click potrebbe essere più adatto. Docopt è una buona scelta per programmi piccoli con interfacce semplici.
Conclusione
In questo articolo abbiamo visto come usare il modulo argparse di Python per sviluppare programmi da riga di comando in Python. Attraverso esempi pratici, abbiamo imparato a creare script realistici che ricevono input dagli utenti e svolgono compiti utili.
Dalla progettazione di una calcolatrice di base allo sviluppo di uno strumento di gestione attività con sottocomandi, il modulo argparse offre la versatilità necessaria per gestire un'ampia gamma di situazioni. Seguendo le best practice come l'organizzazione del codice, test approfonditi e la valutazione di librerie alternative, puoi progettare applicazioni affidabili e semplici da mantenere.
Che tu stia automatizzando attività, analizzando dati o creando strumenti complessi, comprendere il parsing degli argomenti da riga di comando migliora la tua capacità di progettare programmi Python efficaci. Migliora le tue competenze in Python oggi stesso con la nostra Python Fundamentals skill track.
Domande frequenti su Python argparse
Come posso rendere obbligatorio un argomento opzionale in argparse?⌄
Gli argomenti opzionali in argparse in genere non sono necessari perché sono, per definizione, opzionali. Tuttavia, possono esserci casi in cui vuoi che un argomento che inizia con -- sia obbligatorio. Per farlo, imposta il parametro required su True quando aggiungi l'argomento.
Ecco come puoi farlo:
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}')Offerto da
Come gestisco argomenti mutuamente esclusivi con argparse?⌄
A volte puoi imbatterti in argomenti che non dovrebbero essere usati insieme. Per esempio, uno script può accettare --verbose oppure --quiet, ma non entrambi allo stesso tempo. Per affrontare questo scenario, argparse supporta la definizione di gruppi mutuamente esclusivi.
Ecco come impostarlo:
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.')Offerto da
Questo script consente all'utente di abilitare la modalità verbose o quiet, ma non entrambe. Se tentano di utilizzare entrambe le opzioni contemporaneamente, argparse genererà un errore.
Come posso usare argparse per leggere argomenti da un file invece che dalla riga di comando?⌄
Sebbene argparse sia pensato per il parsing degli argomenti da riga di comando, potresti volerli leggere da un file. Puoi farlo leggendo gli argomenti dal file e passandoli al metodo parse_args() tramite il parametro args.
Ecco un esempio.
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 filewithopen('args.txt','r')asfile:
file_args =file.read().split()
args = parser.parse_args(file_args)print(f'Input file: {args.input}')print(f'Output file: {args.output}')Offerto da
In questo caso, il file args.txt potrebbe contenere:
--input data/input.txt --output data/output.txtOfferto da
Lo script legge i parametri dal file, li converte in un elenco e poi li passa a parse_args(). Questo ti permette di gestire gli argomenti in un file invece di inserirli ogni volta.
Come personalizzo il messaggio di aiuto in argparse per mostrare i valori predefiniti?⌄
Per impostazione predefinita, argparse non mostra i valori predefiniti dei parametri nel messaggio di aiuto. Se vuoi includere i valori di default nel testo di aiuto, modifica il parametro help oppure usa ArgumentDefaultsHelpFormatter.
Ecco come aggiungere i valori predefiniti al messaggio di aiuto:
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.')Offerto da
Con ArgumentDefaultsHelpFormatter, il messaggio di aiuto mostrerà il valore predefinito per l'argomento --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)Offerto da
Questo fornisce agli utenti più informazioni sulle impostazioni predefinite del tuo programma.
Quali sono alcune best practice per testare applicazioni da riga di comando che usano argparse?⌄
Testare le app da riga di comando può essere difficile, ma ci sono metodi per semplificare il processo. Un modo utile è simulare gli argomenti della riga di comando usando il modulo unittest.
Ecco un esempio di come testare uno script che usa argparse:
import unittest
import argparse
import sys
defcreate_parser():
parser = argparse.ArgumentParser(description='Process some data.')
parser.add_argument('--number',type=int,help='A number.')return parser
defmain(args):
parser = create_parser()
parsed_args = parser.parse_args(args)if parsed_args.number isNone:
parser.error('No number provided.')
result = parsed_args.number *2return result
classTestMain(unittest.TestCase):deftest_main_with_number(self):
test_args =['--number','5']
result = main(test_args)
self.assertEqual(result,10)deftest_main_without_number(self):
test_args =[]with self.assertRaises(SystemExit):
main(test_args)if __name__ =='__main__':
unittest.main()Offerto da
Nel test:
Il metodo .create_parser() inizializza il parser degli argomenti.
La funzione main() elabora gli argomenti ed esegue la logica principale.
La classe TestMain offre metodi di test per simulare vari input da riga di comando.
I test assicurano che il programma risponda come previsto ai diversi input.
Struttura il tuo codice per separare l'elaborazione degli argomenti dalla logica primaria, rendendo più facile testare le diverse parti del programma.
Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Python è un linguaggio di programmazione potente che permette agli sviluppatori di creare una varietà di applicazioni, dai semplici script a grandi sistemi software. Uno dei compiti più comuni è creare interfacce a riga di comando (CLI), che consentono agli utenti di interagire con i programmi tramite un terminale o la riga di comando. Le CLI sono essenziali per scripting, automazione e in tutti quei casi in cui un'interfaccia grafica è poco pratica.
La gestione dei parametri passati da riga di comando è una parte importante della progettazione di CLI. Questi argomenti consentono agli utenti di influenzare il comportamento di un programma fornendo parametri di input durante l'esecuzione. Senza la capacità di interpretare questi fattori, i programmi sarebbero meno versatili e più difficili da adattare a compiti specifici.
Python offre diversi moduli per la parsificazione degli argomenti da riga di comando, ma il modulo
argparsespicca per semplicità e completezza. Il moduloargparserende facile sviluppare interfacce a riga di comando funzionali. Gestisce automaticamente il parsing dei parametri, mostra istruzioni utili e segnala errori quando gli utenti forniscono informazioni errate.In questo tutorial vedremo come usare il pacchetto Python
argparse. Partiremo con una panoramica delle interfacce a riga di comando in Python e dell'importanza di analizzare l'input da riga di comando. Poi discuteremo il modulo argparse e i suoi vantaggi.Panoramica delle interfacce a riga di comando in Python
Le interfacce a riga di comando sono programmi che funzionano esclusivamente con comandi testuali. Gli utenti inseriscono comandi in un terminale o nella riga di comando, che in genere includono argomenti e opzioni che modificano il comportamento del programma. Le CLI sono utili perché sono facilmente automatizzabili e integrabili con altre tecnologie.
In Python, una CLI si crea sviluppando uno script che accetta input da riga di comando. Questo input di solito è presentato come un elenco di argomenti a cui lo script può accedere e che può interpretare. Per i programmi di base, gestire manualmente questi argomenti tramite l'elenco sys.argv può essere sufficiente. Tuttavia, quando la complessità del programma aumenta, elaborare manualmente gli argomenti diventa inefficiente e soggetto a errori.
Importanza del parsing degli argomenti da riga di comando
Analizzare gli argomenti da riga di comando è necessario per numerosi motivi:
Introduzione al modulo argparse e ai suoi vantaggi
Il modulo
argparsefa parte della libreria standard di Python. Quindi può essere usato senza installare pacchetti aggiuntivi. Offre un'interfaccia semplice e coerente per analizzare gli input da riga di comando. Alcuni dei vantaggi dell'utilizzo diargparsesono:argparse permette agli sviluppatori di concentrarsi sulla funzionalità principale del programma, contando su solide basi per la gestione dell'input da riga di comando.
Configurare argparse e utilizzo di base
Ora che abbiamo visto l'importanza del parsing degli argomenti da riga di comando e i vantaggi di usare
argparse, vediamo come configurarlo e utilizzarlo in uno script Python.Installare e importare argparse
Non serve installare nulla separatamente perché
argparsefa parte della libreria standard di Python. Puoi importarlo all'inizio del tuo script.Questa riga carica il modulo
argparsenel tuo script, consentendoti di usarne le funzionalità per analizzare gli argomenti da riga di comando.Creare un semplice parser di argomenti
Il primo passo per utilizzare
argparseè generare un oggetto parser. Questo oggetto memorizzerà le informazioni sugli argomenti accettati dal programma e analizzerà l'input da riga di comando.In questo esempio creiamo un oggetto
ArgumentParser()e descriviamo il programma. Quando l'utente seleziona l'opzione di aiuto (-ho--help), verrà mostrata questa descrizione.Aggiungere argomenti posizionali e opzionali
Ora che abbiamo creato il parser, possiamo specificare gli argomenti che il nostro programma accetterà.
Aggiungere argomenti posizionali
Gli argomenti posizionali sono essenziali e devono essere forniti in un ordine preciso. Ad esempio, considera uno script che somma due numeri. Possiamo definire due argomenti posizionali per i numeri:
In questo codice,
num1enum2si riferiscono ai parametri posizionali.type=intindica che i parametri devono essere convertiti in interi. L'argomento help specifica una descrizione che apparirà nel messaggio di aiuto.Aggiungere argomenti opzionali
Gli argomenti opzionali non sono necessari e di solito forniscono opzioni aggiuntive o modificano il comportamento del programma. Sono in genere preceduti da uno o due trattini. Aggiungiamo un argomento opzionale per abilitare l'output dettagliato:
Qui:
-v(per esempio,-v).--verboseè l'opzione estesa.action='store_true'indica che, se l'opzione è selezionata, l'attributo verbose sarà impostato suTrue; altrimenti saràFalse.helpspecifica una descrizione per il messaggio di aiuto.Analizzare gli argomenti e accedere ai loro valori
Dopo aver specificato tutti gli argomenti, dobbiamo analizzare l'input della riga di comando. Usa il metodo
.parse_args()per farlo.I parametri analizzati sono ora memorizzati nella variabile
argscome attributi. Possiamo accedervi usando la dot notation.Mettendo tutto insieme, ecco uno script completo che somma due numeri e include una modalità dettagliata opzionale:
Puoi eseguire questo script dalla riga di comando e fornire gli argomenti posizionali richiesti:
Se includi l'opzione
-vo--verbose, lo script stamperà il messaggio aggiuntivo in modalità dettagliata:Se l'utente esegue lo script con l'opzione
-ho--help,argparsemostrerà un messaggio di aiuto generato automaticamente:Questa funzionalità rende il tuo programma più facile da usare fornendo istruzioni chiare su come utilizzarlo.
Gestione avanzata degli argomenti
Quando sviluppi programmi da riga di comando in Python, potresti imbatterti in scenari che richiedono un parsing degli argomenti più complesso. Il modulo
argparsedi Python include diverse funzionalità per soddisfare queste esigenze, consentendoti di sviluppare interfacce flessibili e intuitive.Usare nargs per più argomenti
Ci sono situazioni in cui l'applicazione deve accettare numerosi valori per lo stesso argomento. Per esempio, supponi di voler creare uno script che elabori più file contemporaneamente. Il parametro nargs in
argparseti consente di specificare quanti argomenti da riga di comando devono essere letti.Ecco come usare
nargsper accettare più nomi di file:In questo caso,
nargs='+'indica al parser di aspettarsi uno o più argomenti in filenames. L'utente può fornire quanti nomi di file desidera, e verranno salvati in un elenco chiamatoargs.filenames.Se vuoi accettare un numero preciso di argomenti, imposta
nargssu quel numero. Ad esempio,nargs=2richiede esattamente due parametri.Implementare choices per limitare i valori degli argomenti
A volte vuoi limitare un argomento a un insieme specifico di valori validi. Questo garantisce che l'utente fornisca input validi, evitando errori o comportamenti imprevisti. Il parametro choices ti permette di specificare i valori consentiti per un argomento.
Considera uno script che esegue diverse attività a seconda di una modalità selezionata dall'utente.
In questo script, l'argomento
--modedeve essere uno dei valori indicati. Se l'utente inserisce un valore non presente nell'elenco,argparserestituirà un messaggio di errore.Gestire flag booleani e interruttori
I flag booleani sono opzioni che abilitano o disabilitano funzionalità specifiche nell'applicazione. In genere sono definiti senza un valore: basta includere il flag nel comando. Puoi gestire questi flag in
argparsecon il parametroaction.Per esempio, aggiungiamo una modalità di debug a uno script:
Usando
action='store_true', il flag--debugimposteràargs.debugaTruequando presente e aFalsealtrimenti.Impostare valori predefiniti e argomenti obbligatori
Gli argomenti opzionali spesso includono valori predefiniti sensati. Questo significa che, se l'utente non specifica l'argomento, l'applicazione userà il valore di default. L'argomento
defaultti consente di specificare un valore predefinito.Ecco un esempio:
In questo scenario, se l'utente non specifica
--timeout, il valore predefinito è 30 secondi.Per rendere obbligatorio un argomento opzionale,
imposta required=True.Ora lo script richiederà l'argomento
--recipient.Personalizzare messaggi di aiuto ed errori
Fornire messaggi chiari e utili agli utenti è un elemento essenziale nello sviluppo di un programma a riga di comando efficace. Il modulo
argparsedi Python crea automaticamente i messaggi di aiuto, ma puoi modificarli per adattarli meglio alle tue esigenze.Generare messaggi di aiuto automatici
Per impostazione predefinita,
argparsegenera un messaggio di aiuto, accessibile con le opzioni-ho--help. Questo messaggio contiene l'utilizzo del programma, una descrizione e le informazioni su ciascun argomento.Per esempio:
Quando un utente esegue lo script con
-h, vedrà:Questo messaggio di aiuto automatico fornisce informazioni utili senza richiedere sforzi aggiuntivi.
Personalizzare descrizioni e messaggi di utilizzo
Sebbene i messaggi di aiuto predefiniti siano utili, potresti volerli modificare per fornire informazioni aggiuntive o per seguire una struttura specifica. Puoi cambiare description, epilog e usage nel
ArgumentParser.Per esempio, per includere un epilog e personalizzare il messaggio di utilizzo:
Ora, quando l'utente consulta il messaggio di aiuto, includerà la descrizione, l'uso e l'epilog personalizzati:
Gestire la gestione degli errori e il feedback all'utente
Se un utente inserisce argomenti non validi,
argparsemostrerà un messaggio di errore e terminerà il programma. Puoi modificare questo comportamento per fornire feedback più utile o per gestire gli errori in modo diverso.Un approccio è sovrascrivere il metodo error in una sottoclasse di
ArgumentParser:Se l'utente tenta di dividere per zero in questo script, l'applicazione mostrerà un avviso di errore e il testo di aiuto, indirizzando l'utente a fornire dati validi.
Puoi anche includere una gestione personalizzata degli errori nel tuo script. Ad esempio, per gestire percorsi di file non validi:
Eseguire lo script con un percorso non valido mostrerà l'errore seguente:
Esempi reali e casi d'uso
Capire come usare il modulo
argparsein contesti reali ne chiarirà ulteriormente la funzionalità. Vediamo alcuni esempi di utilizzo diargparsein applicazioni pratiche.Creare una calcolatrice da riga di comando
Supponi di dover sviluppare una semplice calcolatrice che esegua operazioni aritmetiche di base dalla riga di comando. Questa calcolatrice dovrebbe accettare due numeri e un operatore per eseguire il calcolo richiesto.
Ecco come affrontare questo compito:
In questo script, il modulo
argparseè usato per definire tre argomenti posizionali: due numeri e un operatore. L'argomentochoiceslimita l'operatore a simboli aritmetici validi. Quando l'utente esegue lo script, può effettuare questi calcoli:Questa calcolatrice di base mostra come le opzioni da riga di comando possano aumentare la flessibilità e l'interattività di un programma.
Creare uno script di elaborazione file con più opzioni
Supponi ti serva uno script che elabori file di testo e fornisca opzioni come la definizione di un file di output, la selezione di una modalità di elaborazione e l'abilitazione dell'output dettagliato.
Ecco un esempio di configurazione:
Questo script accetta un file di input e offre opzioni per il file di output, la modalità di elaborazione e l'output dettagliato. Gli utenti possono modificare il comportamento dello script senza alterare il codice.
Sviluppare uno strumento CLI con sottocomandi
In applicazioni più complesse, possono servire dei sottocomandi, in modo simile a come git funziona con comandi come git commit e git push. Il modulo
argparsefornisce subparsers per questo scopo.Ecco come creare uno strumento CLI con sottocomandi:
In questo esempio, lo script ha tre sottocomandi:
add,listecomplete. Ogni sottocomando ha i propri argomenti. Quando gli utenti eseguono lo script, inseriscono il sottocomando e gli eventuali altri parametri.Per esempio:
Elencare le attività
Contrassegnare le attività come completate:
subparsersti permettono di creare strumenti da riga di comando complessi, ben organizzati e facili da estendere, consentendoti di costruire applicazioni che possono svolgere più funzioni in un'unica interfaccia.Best practice e consigli per Python argparse
Sviluppare programmi da riga di comando non significa solo scrivere codice che funziona. Vuol dire anche scrivere codice pulito, manutenibile e facile da usare.
Ecco alcune best practice quando lavori con il modulo
argparse.Organizzare il codice per leggibilità e manutenzione
Quando gli script diventano più complessi, è fondamentale mantenere il codice organizzato per migliorarne la comprensione e la manutenzione. Un modo per riuscirci è usare funzioni e classi per strutturare le diverse parti del codice.
Suddividere il programma in parti più piccole e riutilizzabili lo rende più gestibile ed elimina duplicazioni di codice.
Per esempio, in uno script di gestione attività, potresti definire funzioni diverse per aggiungere attività, elencarle e completarle. Questa divisione ti permette di concentrarti su un aspetto della logica alla volta, rendendo il codice più chiaro.
Un'altra tecnica efficace è separare la logica di parsing degli argomenti dal resto del codice. Inserire tutte le definizioni degli argomenti e il parsing all'inizio dello script, o in una funzione dedicata, facilita a chi legge la comprensione di come il programma gestisca l'input.
Usare nomi di variabili appropriati migliora anche la leggibilità. Scegli nomi che riflettano lo scopo, così chiunque legga il codice può capire cosa sta succedendo. Includere commenti e
docstringper spiegare cosa fanno le funzioni e i dettagli chiave può contribuire ad aumentare la comprensione.Test e debug di applicazioni da riga di comando
Testare le applicazioni è fondamentale per assicurarsi che funzionino correttamente e per individuare i problemi in anticipo. Scrivere unit test con framework come
unittestopytestè un ottimo modo per testare il codice. Questi test ti permettono di simulare vari input e verificare che le funzioni lavorino correttamente.Ad esempio, puoi testare diversi scenari simulando gli input della riga di comando invece di eseguire lo script dal terminale. Questa strategia ti consente di assicurarti che il parsing degli argomenti funzioni come previsto e che l'applicazione gestisca correttamente vari casi.
Gestire le eccezioni con grazia è altrettanto importante. Usando blocchi
try-exceptpuoi intercettare gli errori e fornire messaggi utili all'utente. Questo rende la tua applicazione più stabile e facile da usare.Valuta anche di includere un flag di debug nello script. Questo flag può abilitare un output aggiuntivo che ti aiuta a tracciare l'esecuzione del programma quando qualcosa non va. Avere questa opzione rende più semplice diagnosticare i problemi durante sviluppo e manutenzione.
Confrontare argparse con altre librerie di parsing degli argomenti
Sebbene
argparsesia un'utilità preziosa nella libreria standard di Python, esistono altre librerie che offrono metodi alternativi per analizzare gli argomenti da riga di comando. Conoscere queste opzioni ti aiuta a scegliere lo strumento giusto per il tuo progetto.Una di queste librerie è Click. Click è un pacchetto di terze parti per creare interfacce a riga di comando con i decorator. Ha una sintassi più intuitiva ed è ideale per applicazioni sofisticate. Per esempio, puoi usare i decorator in Python per creare comandi e opzioni, rendendo il codice più compatto e leggibile.
Docopt è un'altra opzione che ti permette di definire la tua interfaccia a riga di comando usando la docstring del programma. Docopt analizza automaticamente il messaggio di aiuto e costruisce il parser degli argomenti quando le istruzioni di utilizzo sono incluse nella docstring. Questo approccio è elegante e adatto a script semplici che richiedono una specifica più leggibile.
Quando scegli quale libreria utilizzare, pensa alle esigenze del tuo progetto. Se vuoi evitare dipendenze esterne e desideri uno strumento che copra la maggior parte dei casi, argparse è un'ottima soluzione. Se vuoi una sintassi più intuitiva e stai lavorando a un'applicazione complessa, Click potrebbe essere più adatto. Docopt è una buona scelta per programmi piccoli con interfacce semplici.
Conclusione
In questo articolo abbiamo visto come usare il modulo
argparsedi Python per sviluppare programmi da riga di comando in Python. Attraverso esempi pratici, abbiamo imparato a creare script realistici che ricevono input dagli utenti e svolgono compiti utili.Dalla progettazione di una calcolatrice di base allo sviluppo di uno strumento di gestione attività con sottocomandi, il modulo
argparseoffre la versatilità necessaria per gestire un'ampia gamma di situazioni. Seguendo le best practice come l'organizzazione del codice, test approfonditi e la valutazione di librerie alternative, puoi progettare applicazioni affidabili e semplici da mantenere.Che tu stia automatizzando attività, analizzando dati o creando strumenti complessi, comprendere il parsing degli argomenti da riga di comando migliora la tua capacità di progettare programmi Python efficaci. Migliora le tue competenze in Python oggi stesso con la nostra Python Fundamentals skill track.