python argparse прекращает синтаксический анализ после того, как встречает «$»

Я пытаюсь разобрать командную строку с помощью argparse

from argparse import ArgumentParser

argparser = ArgumentParser(prog="parse", description="desc")

create.add_argument("--name",dest="name",required=True,help="Name for element")
args = argparser.parse_args()
print(args)

Когда я выполняю это с помощью команды ниже

python argparser.py  --name "input$output$"

Результат:

('args:', Namespace(name='input$'))

Ожидаемый результат:

('args:', Namespace(name='input$output$'))

Помогите, пожалуйста, разобраться, что я делаю не так? Почему argparse прекращает синтаксический анализ после обнаружения специального символа?


person Rahul Goyal    schedule 17.05.2016    source источник
comment
Попробуйте избежать $, используя вместо этого /$   -  person Keatinge    schedule 17.05.2016
comment
Посмотрите на sys.argv, чтобы узнать, с чем должен работать argparse.   -  person hpaulj    schedule 17.05.2016


Ответы (2)


Это связано с тем, что большинство оболочек рассматривают строки, начинающиеся с $, как переменную, и при заключении в двойные кавычки оболочка пытается заменить ее своим значением.

Просто откройте терминал/консоль и введите это в оболочке (это работает как в bash, так и в fish):

echo "hi$test"  # prints hi trying to interpolate the variables 'test'
echo 'hi$test' # prints hi$test no interpolation for single quotes

Это происходит до того, как оболочка запускает процессы приложения. Поэтому я думаю, что при вызове вашего приложения вам нужно передать строку, заключенную в одинарные кавычки, или экранировать $ обратной косой чертой.

echo "hi\$test" # prints hi$test since $ is escaped

Если вы хотите увидеть, что Python на самом деле получает от оболочки в качестве аргумента, непосредственно проверьте sys.argv (именно здесь argparse и другие модули, например, читают аргументы командной строки).

import sys
print sys.argv

В этом конкретном случае в вопросе происходит то, что ваша оболочка анализирует input$output$ и пытается интерполировать переменную $output, но такая переменная не определена, поэтому она заменяется пустой строкой. То, что на самом деле передается в Python в качестве аргумента, это input$ (последний знак доллара остается там, потому что это всего лишь один знак доллара, который не может быть именем переменной).

person farzad    schedule 17.05.2016
comment
Есть ли какой-либо альтернативный способ, кроме экранирования с помощью '\'. - person Rahul Goyal; 18.05.2016
comment
Зависит от вашей оболочки. Bash очень распространен, поэтому я предполагаю, что вы используете bash. Например, я использую fish, а echo "hi$test$" не запускается (fish жалуется на последнюю $, которая является переменной без имени), но bash игнорирует ее и рассматривает как буквальный знак доллара. Но самый распространенный способ предотвратить интерполяцию (известный мне) — это либо использование одинарных кавычек, либо экранирование обратной косой чертой. - person farzad; 18.05.2016

Это может быть связано с вашей средой оболочки, поскольку в bash $ сигнализирует о начале переменной. $output, вероятно, заменит пустую строку. $ сам по себе не заменяется.

person mobiusklein    schedule 17.05.2016