Python, цитаты в цитате - PullRequest
       9

Python, цитаты в цитате

2 голосов
/ 23 января 2012

Я пытаюсь создать сценарий nagios, но у меня возникают проблемы с одинарной кавычкой внутри двойной.

Я пытаюсь передать следующее:

select (select count(*) from v$session)/(select value from v$parameter where name = 'processes')*100 Percent from dual"

Выбор должен быть указан так же, как и выше.

Я пытался передать это в строку различными способами:

line=select (select count(*) from v$session)/(select value from v$parameter where name = 'processes')*100 Percent from dual"

чем создал такую ​​команду:

process= '"' + line + '"'

p = subprocess.Popen( line.split())

К сожалению, line.split не выполняет правильный анализ цитаты.

"select" должен быть заключен в кавычки, а 'processes' должен быть заключен в одинарные кавычки.

Есть предложения, как мне это сделать?

Обновление:

По-видимому, проблема связана с процессом "split". Оператор sql должен быть передан без изменений и заключен в один оператор. Однако я привел довольно много сложных аргументов, и line.split работал на это, пока не столкнулся с этой проблемой.

Так что лучший вопрос в том, как мне отформатировать подпроцесс для отправки с ним всей строки, а также длинного списка (около 5 строковых аргументов)?

Обновление:

На случай, если это кому-нибудь поможет. Очевидно, с Popen вы должны разделить аргументы и вклад. Так что, например, вы не можете отправить "--test blah"; должно быть "--test", "blah". Это означает, что для отправки строки необходимо ее разбить.

Однако, если нужна целая строка, вы должны отредактировать ее и добавить в список.

Так, например

a = "--test blah --something other"
b = a.split()

Это создаст список, и Popen прекрасно с ним справится (с subprocess.Popen(b)).

Однако, если вам нужно также отправить целую строку, как это:

sql = "select count(*) from v$session"

вы не можете просто добавить это к "строке", как в a + sql. Вам нужно сделать что-то вроде этого:

b.append(sql)

, который добавит всю строку, а затем Popen знает, как с ней справиться.

К сожалению (по крайней мере, насколько мне известно), невозможно отправить Popen строку, такую ​​как:

c = a + sql
subprocess.Popen(c)

и получите ответ, если вы не используете shell=True. Тем не менее, вы получаете оператор return и НЕ выводите.

Надеюсь, это поможет кому-то в такой же ситуации, как и я.

Ответы [ 2 ]

4 голосов
/ 23 января 2012

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

Попробуйте использовать тройные кавычки :

line=""" "select (select count(*) from v$session)/(select value from v$parameter where name = \'processes\')*100 Percent from dual" """

... который печатает:

"select (select count(*) from v$session)/(select value from v$parameter where name = 'processes')*100 Percent from dual"
2 голосов
/ 23 января 2012
  • используйте тройные кавычки:

"""valid single ' and double quotes " in string"""

или

'''valid single ' and double quotes " in string'''

  • если вам нужно использовать кавычки в одинарных кавычках, экранируйте их обратной косой чертой:

"valid \" string"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...