Come posso usare argparse di Python con una stringa di argomenti predefinita?

StackOverflow https://stackoverflow.com/questions/8878478

  •  28-10-2019
  •  | 
  •  

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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top