在 python 脚本中我有一个函数,如下所示:
def NotifierFunc(Mail, Ticket_Num, Open_DtTime):
cmd = "/home/path/MyPerlScript.pl --channel 'MyChannel' --userid 'itsme' --message 'Hello <at>"+Mail+"<at> : The ticket <a href='`echo 'http://snview/'"+Ticket_Num+">`echo "+Ticket_Num+"`</a> is not closed for more than 72 hours : Open since "+Open_DtTime+" IST. Please close asap.' "
print(cmd)
subprocess.Popen(cmd, shell= True, stout=subprocess.PIPE)
打印什么:
/home/path/MyPerlScript.pl --channel 'MyChannel' --userid 'itsme' --message 'Hello <at>[email protected]<at> : The ticket <a href='`echo 'http://snview/'INC23548>`echo INC23548`</a> is not closed for more than 72 hours : Open since 4-APR-2024 12:30:40 IST. Please close asap.'
此命令在 shell 中无法成功执行,主要是因为消息(在“--message”之后传递的所有内容都在单引号内),或者至少我是这么认为的。 当我把它放在双引号下时,python 脚本会抛出语法错误。 当我将整个 cmd 值放在单引号或文档字符串引号(''')中并将 --message 内容放在双引号中时,也会导致语法错误。
如果我直接在Linux命令行上运行cmd(将--message内容放在双引号内)它工作正常:
> Mail="[email protected]"
> Ticket_Num="INC23548"
> Open_DtTime = "14-APR-2024 12:30:40"
> /home/path/MyPerlScript.pl --channel 'MyChannel' --userid 'itsme' --message "Hello <at>$Mail<at> : The ticket <a href='`echo 'http://snview/'$Ticket_Num >`echo $Ticket_Num`</a> is not closed for more than 72 hours : Open since $Open_DtTime IST. Please close asap."
现在我的问题是如何将整个 cmd 值传递给子进程,以便可以正确呈现 '--message' 的内容 - 或者如何将 '--message' 内容放在双引号内并使其工作.
请注意,如果我传递如下命令 - 它工作正常,但没有票号的超链接。但我需要超链接。
cmd = "/home/path/MyPerlScript.pl --channel 'MyChannel' --userid 'itsme' --message 'Hello <at>"+Mail+"<at> : The ticket +Ticket_Num+" is not closed for more than 72 hours : Open since "+Open_DtTime+" IST. Please close asap.' "
我还尝试将变量放在 {} 中,并尝试了各种引号组合。到目前为止没有任何效果。 我正在使用 python 3.10
subprocess.Popen
将列表作为第一个参数,这使得处理和插入字符串变得更容易。不必因为其他序列包含引号或双引号而转义某些序列,而是像文档中的示例一样将它们分开。
我创建了一个测试 perl 脚本,它只打印每个参数以从 python 运行。
#!/usr/bin/env perl
use feature qw(say);
say for @ARGV;
并像这样从 python 执行它
#!/usr/bin/env python
import subprocess
import sys
def NotifierFunc(Mail, Ticket_Num, Open_DtTime):
cmd = [
"./main.pl",
"--channel",
"MyChannel",
"--userid",
"itsme",
"--message",
f'Hello <at>{Mail}<at> : The ticket <a href="http://snview/f{Ticket_Num}">{Ticket_Num}</a> is not closed for more than 72 hours : Open since {Open_DtTime} IST. Please close asap.',
]
result = subprocess.Popen(cmd, shell=False, stdout=sys.stdout)
if __name__ == "__main__":
NotifierFunc("[email protected]", "INC23548", "14-APR-2024 12:30:40")
这似乎按预期打印了所有参数
› python main.py
--channel
MyChannel
--userid
itsme
--message
Hello <at>[email protected]<at> : The ticket <a href="http://snview/fINC23548">INC23548</a> is not closed for more than 72 hours : Open since 14-APR-2024 12:30:40 IST. Please close asap.