Python,引用中的引号

3 投票
2 回答
3889 浏览
提问于 2025-04-17 10:51

我正在尝试制作一个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 string”中,比如a + sql。你需要做类似这样的事情:

b.append(sql)

这样就会添加整个字符串,然后Popen知道如何处理它。

不幸的是(至少据我所知),不能直接发送像Popen这样的字符串:

c = a + sql
subprocess.Popen(c)

并获得响应,除非你使用shell=True。不过,这样你得到的是返回语句,而不是输出。

希望这能帮助到和我有类似情况的人。

2 个回答

2
  • 使用三重引号:

"""有效的单引号 ' 和双引号 " 在字符串中"""

或者

'''有效的单引号 ' 和双引号 " 在字符串中'''

  • 如果你需要在单引号中使用引号,可以用反斜杠来转义:

"有效的 \" 字符串"

4

如果我理解你的意思,你是想在选择的内容周围加上引号,同时还想对 processes 周围的单引号进行转义。

可以试试使用三重引号

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"

撰写回答