2013-08-10 19 views
18

Utilizzando python e argparse, l'utente può immettere un nome file con -d come flag.Gestire gli spazi nell'input argparse

parser.add_argument("-d", "--dmp", default=None) 

Tuttavia, questo non è riuscito quando il percorso incluso spazi. Per esempio.

-d C:\SMTHNG\Name with spaces\MORE\file.csv 

NOTA: gli spazi causerebbe un errore (bandiera prende solo in 'C: SMTHNG \ Nome' come input).

error: unrecognized arguments: with spaces\MORE\file.csv 

mi ha preso più di quello che dovrebbe avere per trovare la soluzione a questo problema ... (nessuno è riuscito a Q & A per così sto facendo il mio post)

risposta

16

soluzione semplice : argparse considera una stringa con spazio pieno come un singolo argomento se è racchiusa tra virgolette.

Questo ingresso ha lavorato e "risolto" il problema:

-d "C:\SMTHNG\Name with spaces\MORE\file.csv" 

AVVISO: argomento ha "" intorno ad esso.

+0

Come facciamo di solito leggiamo qui intorno ... sentitevi liberi di accettare la tua risposta: D – Jblasco

+7

Non si tratta di argparse; questo è il modo in cui le shell analizzano gli argomenti sulla maggior parte dei sistemi (e su come i programmi simulano lo shell-style-parsing sui sistemi che non hanno shell reali). Nel momento in cui si arriva al modulo 'argparse', la versione originale è già 4 argomenti separati, e argparse non può fare nulla al riguardo. – abarnert

+0

@abarnert, grazie per l'input. –

20

Per coloro che non possono analizzare argomenti e ancora ottenere "l'errore: argomenti non riconosciuti:" Ho trovato una soluzione:

parser.add_argument('-d', '--dmp', nargs='+', ...) 
opts = parser.parse_args() 

e poi quando si desidera utilizzarlo solo fare

' '.join(opts.dmp) 
+3

questa risposta è superiore a quella accettata. – FuzzyAmi

+0

Cosa succede se ho una stringa come: signora che ha un apostrofo (') nel mezzo? – dorado

+1

@FuzzyAmi Non è superiore. Lo completa semplicemente. Mi piacciono entrambe le risposte. Ho effettivamente optato per la risposta accettata me stesso. –

1

Bumped in questo problema anche oggi.

-d "foo bar" 

non ha aiutato. Ho dovuto aggiungere il segno uguale

-d="foo bar" 

e quindi ha funzionato.

+0

Qual è il tuo setup? –

+0

python 3.5.1 su RHEL6 –

0

Dopo alcuni esperimenti (python 2.7 Win10) ho scoperto che la regola d'oro è mettere virgolette ("") attorno a argomenti che contengono spazi e fare NON mettere se non ci sono spazi in argomento. Anche se stai passando una stringa/percorso. Anche mettere una virgoletta ('') è una cattiva idea, almeno per Windows.

piccolo esempio: python script.py --path .... \ Some_Folder \ --string "Qui va una stringa"