如何使用 Subprocess/shell 从 Python 脚本中调用带有几个带有 html 标签的参数的 Perl 脚本? HTML 标记不起作用

问题描述 投票:0回答:1

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

python html shell perl subprocess
1个回答
0
投票

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.
© www.soinside.com 2019 - 2024. All rights reserved.