См. Замена оболочки конвейера :
import subprocess
proc1 = subprocess.Popen(['ps', 'cax'], stdout=subprocess.PIPE)
proc2 = subprocess.Popen(['grep', 'python'], stdin=proc1.stdout,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
proc1.stdout.close() # Allow proc1 to receive a SIGPIPE if proc2 exits.
out, err = proc2.communicate()
print('out: {0}'.format(out))
print('err: {0}'.format(err))
PS.Использование shell=True
может быть опасным.См., Например, предупреждение в документации.
Существует также модуль sh , который может сделать скрипты подпроцессов в Python намного более приятными:
import sh
print(sh.grep(sh.ps("cax"), 'something'))