Popen.communicate()
документация:
Обратите внимание, что если вы хотите отправить данные в
стандартный процесс, вам нужно
создать объект Popen с
STDIN = PIPE. Точно так же, чтобы получить что-нибудь
кроме None в кортеже результата,
вам нужно дать стандартный вывод = ТРУБА и / или
stderr = ТРУБА тоже.
Замена os.popen *
pipe = os.popen(cmd, 'w', bufsize)
# ==>
pipe = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE).stdin
Предупреждение Используйте связь () вместо
stdin.write (), stdout.read () или
stderr.read (), чтобы избежать взаимных блокировок
к любому из других буферов OS OS
наполнение и блокировка ребенка
процесс.
Итак, ваш пример можно записать следующим образом:
from subprocess import Popen, PIPE, STDOUT
p = Popen(['grep', 'f'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
grep_stdout = p.communicate(input=b'one\ntwo\nthree\nfour\nfive\nsix\n')[0]
print(grep_stdout.decode())
# -> four
# -> five
# ->
В текущей версии Python 3 вы можете использовать subprocess.run
, чтобы передать входные данные в виде строки внешней команде и получить ее состояние выхода, а ее выходные данные в виде строки обратно за один вызов:
#!/usr/bin/env python3
from subprocess import run, PIPE
p = run(['grep', 'f'], stdout=PIPE,
input='one\ntwo\nthree\nfour\nfive\nsix\n', encoding='ascii')
print(p.returncode)
# -> 0
print(p.stdout)
# -> four
# -> five
# ->