Python экранирует специальные символы в sys argv

У меня есть сценарий, который принимает sys.argv, и ввод может содержать специальные символы (точку с запятой). Мне просто нужен ввод в виде строки, но точка с запятой все портит.

У меня есть:

def myscript(text)
    print text


a = myscript(sys.argv[1])
print a

Я попробую:

>>  python script.py "With these words she greeted Prince Vasili Kuragin, a man of high rank and importance, who was the first to arrive at her reception. Anna Pavlovna had had a cough for some days. She was, as she said, suffering" from la grippe; grippe being then a new word in St. Petersburg""

Я получил:

'With these words she greeted Prince Vasili Kuragin, a man of high rank and importance, who was the first to arrive at her reception. Anna Pavlovna had had a cough for some days. She was, as she said, suffering'
None
bash: grippe: command not found

Я просто хочу получить всю строку в сценарии, независимо от того, что внутри нее.

Я старался:

a = myscript(repr(sys.argv[1]))
a = myscript(str(sys.argv[1]))

person Stpn    schedule 06.03.2012    source источник


Ответы (2)


дело не в питоне, его нужно экранировать в вызывающей оболочке. просто экранируйте кавычки как \" и точки с запятой как \;.

$ python testme.py "With these words she greeted Prince Vasili Kuragin, a man of high rank and importance, who was the first to arrive at her reception. Anna Pavlovna had had a cough for some days. She was, as she said, suffering\" from la grippe; grippe being then a new word in St. Petersburg\""

With these words she greeted Prince Vasili Kuragin, a man of high rank and importance, who was the first to arrive at her reception. Anna Pavlovna had had a cough for some days. She was, as she said, suffering" from la grippe; grippe being then a new word in St. Petersburg"
person Not_a_Golfer    schedule 06.03.2012
comment
Ввод осуществляется пользователями и всегда отличается. Или может я чего-то не понимаю..? - person Stpn; 06.03.2012
comment
точка с запятой внутри цитаты допустима. произошло то, что первая кавычка закрыла аргумент, а точка с запятой заставила оболочку выполнить вашу команду. как вы получаете пользовательский ввод? - person Not_a_Golfer; 07.03.2012
comment
ну, это отправляется с веб-сайта... Думаю, я могу фильтровать все на веб-сайте через регулярное выражение, но мне было интересно, есть ли более простой способ сделать это.. - person Stpn; 07.03.2012
comment
это поможет? >>> re.escape('hello "world"') 'hello\\ \\"world\\"' - person Not_a_Golfer; 07.03.2012

Это не проблема python, это проблема bash. Bash считает, что ; (точка с запятой) отделяет новую команду bash. Вам нужно убежать от него.

person Pablo Santa Cruz    schedule 06.03.2012
comment
Хорошо, я вижу, спасибо! ТОгда есть ли способ принудительно сбежать на стороне bash? - person Stpn; 07.03.2012