Skip to main content
 首页 » 编程设计

Python:如何在子进程中使用反引号

2025年05月04日13webabcd

我想从 Python 运行一个子进程。命令字符串中有几个带反引号的子命令:

subprocess = subprocess.Popen(["echo", "COMMAND [`date +%%s`] SCHEDULE_HOST_DOWNTIME;%s;`date +%%s`;`date -d 'now + %d sec' +%%s`;1;;;%s;Downtime comment" % (hostname, 300, username)], stdout=subprocess.PIPE) 

虽然不执行反引号中的date 命令。此命令的标准输出是:

COMMAND [`date +%s`] SCHEDULE_HOST_DOWNTIME;example.com;`date +%s`;`date -d 'now + 300 sec' +%s`;1;;;my-username;Downtime comment 

我还尝试使用 $(date +%s) 而不是反引号,并通过 subprocess.Popen(["/bin/bash", "-c ", "echo", "..."],结果相同。

如何解决?我知道我当然可以在这种特定情况下使用 Python 的 datetime 模块。但我想知道为什么这不起作用以及如何在不撕裂命令的情况下解决它。虽然我在这里能够在 Python 中轻松运行时间戳计算,但在其他情况下,它可能会更复杂,我将被迫运行多个子进程,这很快就会变得非常难看。

请您参考如下方法:

反引号是 shell 语法特性,但您并不是在 shell 中运行命令。 subprocess 模块直接运行命令。

提供一个字符串而不是一个列表,如果 shell 需要将命令作为一个条目来处理,则设置 shell=True:

subprocess = subprocess.Popen( 
    'echo "COMMAND [`date +%%s`] SCHEDULE_HOST_DOWNTIME;%s;`date +%%s`;`date -d \'now + %d sec\' +%%s`;1;;;%s;Downtime comment"' % (hostname, 300, username), 
     stdout=subprocess.PIPE 
     shell=True)