Я пытаюсь создать сценарий 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 и НЕ выводите.
Надеюсь, это поможет кому-то в такой же ситуации, как и я.