udo*_*dan 1 python bash subprocess backticks
I would like to run a subprocess from Python. Inside the command string are several subcommands with backticks:
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)
Run Code Online (Sandbox Code Playgroud)
Though the date commands in the backticks are not executed. The stdout of this command is:
COMMAND [`date +%s`] SCHEDULE_HOST_DOWNTIME;example.com;`date +%s`;`date -d 'now + 300 sec' +%s`;1;;;my-username;Downtime comment
Run Code Online (Sandbox Code Playgroud)
I also tried to use $(date +%s) instead of backticks and explicitly sent it to bash via subprocess.Popen(["/bin/bash", "-c", "echo", "..."], with the same result.
怎么解决这个问题?我知道我当然可以datetime在这种特殊情况下使用Pythons 模块.但我想知道为什么这不起作用以及如何解决它而不撕裂命令.虽然我在这里可以轻松地在Python中运行时间戳计算,但在其他情况下,它可能会更复杂,我将被迫运行几个快速非常难看的子进程.
反引号是shell语法功能,但您没有在shell中运行命令.所述subprocess模块运行命令直接.
提供一个字符串而不是列表,并设置shell=Trueshell是否需要将命令作为一个条目处理:
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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1112 次 |
| 最近记录: |