2013-08-10 2 views
18

Используя python и argparse, пользователь может ввести имя файла с -d в качестве флага.Ручные пробелы в вводе argparse

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

Однако это не удалось, когда путь включал пробелы. Например.

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

Примечание: пространства вызовет ошибку (флаг принимает только в 'C: SMTHNG \ Name' в качестве входных данных).

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

Взял меня больше, чем следовало бы найти решение этой проблемы ... (не найти Q & А при этом, чтобы я сделать свой собственный пост)

ответ

16

Простое решение : argparse рассматривает пробел, заполненный как единый аргумент, если он заключен в кавычки.

Этот вход работал и "решить" проблему:

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

ВНИМАНИЕ: аргумент имеет "" вокруг него.

+0

Как мы обычно читали здесь ... не стесняйтесь принять ваш ответ: D – Jblasco

+7

Речь идет не о argparse; это то, как оболочки анализируют аргументы в большинстве систем (и как программы подделывают размытие в стиле оболочки в системах, у которых нет реальных оболочек). Когда вы дойдете до модуля 'argparse', ваша исходная версия будет уже 4 отдельными аргументами, и argparse ничего не сможет с этим поделать. – abarnert

+0

@abarnert, спасибо за вход. –

20

Для тех, кто не может разобрать аргументы и все еще получаю «ошибка: непризнанных аргументы:» Я нашел обходной путь:

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

, а затем, когда вы хотите использовать его вобще

' '.join(opts.dmp) 
+3

этот ответ превосходит принятый. – FuzzyAmi

+0

Что делать, если у меня есть строка вроде: ma'am, у которой есть апостроф (') посередине? – dorado

+1

@FuzzyAmi Это не превосходно. Это просто дополняет его. Мне нравятся оба ответа. На самом деле я сам решил принять принятый ответ. –

1

Сегодня столкнулся с этой проблемой.

-d "foo bar" 

не помогло. Я должен был добавить знак равенства

-d="foo bar" 

а затем он действительно работал.

+0

Какая у вас настройка? –

+0

python 3.5.1 на RHEL6 –

0

После некоторых экспериментов (python 2.7 Win10) я узнал, что золотое правило заключается в том, чтобы поставить кавычки ("") вокруг аргументов, которые содержат пробелы, и сделать NOT put, если в аргументе нет пробелов. Даже если вы передаете строку/путь. Также положить одиночные кавычки ('') - плохая идея, по крайней мере для Windows.

Небольшой пример: питон script.py --path .... \ Some_Folder \ --string «Здесь идет строка»