我想从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", "..."]
明确地将其发送到bash,结果相同。
如何解决这个问题?我知道在这种特定情况下我当然可以使用Pythons datetime
模块。但我想知道为什么这不起作用以及如何解决它而不撕裂命令。虽然我能够在Python中轻松运行时间戳计算,但在其他情况下,它可能会更复杂,我将被迫运行几个快速非常难看的子进程。
答案 0 :(得分:7)
反引号是 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)