2015-02-02 6 views
1

Я хотел бы запустить подпроцесс из Python. Внутри командная строка несколько Подкоманд с: обратными кавычкамиPython: Как использовать 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) 

Хотя 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", "..."], с тем же результатом.

Как это можно решить? Я знаю, что я могу, конечно, использовать модуль Pythons datetime в этом конкретном случае. Но я хочу знать, почему это не работает и как его решить, не разрывая команду. В то время как я здесь могу легко выполнить расчет временной метки в Python, в других случаях это может быть более сложным, когда мне придется запускать несколько подпроцессов, которые быстро становятся очень уродливыми.

+0

не связаны: вы можете назвать 'Int (time.time())' в Python для эмуляции команды 'date +% s'. – jfs

ответ

6

Backticks - это функция синтаксиса оболочки , но вы не используете свою команду в оболочке. Модуль subprocess выполняет команду напрямую.

Обеспечить одна строка а не список, а также установить 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) 
+0

Это было быстро и правильно. Строка эха должна быть процитирована, но работает отлично. Благодаря! – udondan

+0

@ DanielSchroeder: добавлено в цитате для вас. –

+0

В качестве альтернативы, захватите вывод 'date +% s' через' subprocess.Popen' или напрямую используя функции времени python, а затем сформулируйте строку посредством конкатенации строк, если вы хотите избежать 'shell = True' ... (I «Некоторые люди, которым не нравится« shell = True »...: D) – anishsane