import subprocess
task = subprocess.Popen("cat file.log | tail -1", shell=True, stdout=subprocess.PIPE)
data = task.stdout.read()
assert task.wait() == 0
Обратите внимание, что это не захватывает stderr. И если вы хотите захватить и stderr, вам нужно использовать task.communicate()
; вызов task.stdout.read()
и затем task.stderr.read()
может привести к взаимоблокировке, если заполнится буфер для stderr. Если вы хотите, чтобы они были объединены, вы можете использовать 2>&1
как часть команды оболочки.
Но, учитывая ваш точный случай,
task = subprocess.Popen(['tail', '-1', 'file.log'], stdout=subprocess.PIPE)
data = task.stdout.read()
assert task.wait() == 0
полностью исключает необходимость в трубе.