我正在尝试构建一个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'
。
有什么建议我怎么做?
显然问题在于“分裂”过程。必须完整地传递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语句而不是输出。
希望这能帮助处于类似情况的人。
答案 0 :(得分:4)
如果我理解你的要求,那么你希望能够在select周围有引号,并且还可以绕过进程的单引号。
尝试使用triple quotes:
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"
答案 1 :(得分:2)
"""valid single ' and double quotes " in string"""
或
'''valid single ' and double quotes " in string'''
"valid \" string"