Come posso usare argparse di Python con una stringa di argomenti predefinita?
Domanda
Voglio usare il modulo argparse pythons per analizzare la mia stringa di parametri cli.Questo funziona per i parametri un passaggio dal terminale, ma non con una data stringa.
import argparse
parser = argparse.ArgumentParser(description='Argparse Test script')
parser.add_argument("param", help='some parameter')
argString = 'someTestFile'
print(argString)
args = parser.parse_args(argString)
Se eseguo questo script ottengo questo output:
~/someTestFile
usage: argparsetest.py [-h] param
argparsetest.py: error: unrecognized arguments: o m e T e s t F i l e
Il ~/someTestFile
è in qualche modo trasformato in o m e T e s t F i l e
.Come già accennato, funziona se passo il nome del file dal terminale.
Potrei immaginare che questo abbia qualcosa a che fare con le codifiche delle stringhe.Qualcuno ha un'idea di come risolvere questo problema?
Soluzione
Ah, no no no.parser.parse_args()
prevede una sequenza nella stessa forma di sys.argv[1:]
.Se tratti una stringa come una sequenza sys.argv, ottieni ['s', 'o', 'm', 'e', 'T', 'e', 's', 't', 'F', 'i', 'l', 'e']
.'s' diventa l'argomento pertinente, quindi il resto della stringa non è analizzabile.
Invece, probabilmente vorrai passare parser.parse_args(['someTestFile'])
Altri suggerimenti
Un'altra opzione è utilizzare shlex.split .È particolarmente conveniente se si dispone di una stringa di argomenti CLI reale:
import shlex
argString = '-vvvv -c "yes" --foo bar --some_flag'
args = parser.parse_args(shlex.split(argString))
Proprio come il sys.argv
predefinito è un elenco, anche i tuoi argomenti devono essere un elenco.
args = parser.parse_args([argString])
È sufficiente generare un codice tag per la stringa di comando:
args = parser.parse_args(argString.split())
Un esempio completo da mostrare:
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--dummy_opt', nargs='*', type=int, help='some ids')
argString = "--dummy_opt 128 128"
args = parser.parse_args(argString.split())
print(args)
produrrà:
split