W3C исключил такой селектор из-за огромного влияния производительности на браузер.
Лучше использовать communicate
:
from subprocess import Popen, PIPE, STDOUT
p = Popen(['myapp'], stdout=PIPE, stdin=PIPE, stderr=PIPE)
stdout_data = p.communicate(input='data_to_write')[0]
«Лучше» из-за этого предупреждения:
Использовать обмениваться (), а не .stdin.write, .stdout.read или .stderr.read, чтобы избежать взаимоблокировок из-за того, что любой из других буферов буферов ОС заполняет и блокирует дочерний процесс.
Вы можете предоставить файл-подобный объект аргументу stdin
в subprocess.call()
.
Документация для объекта Popen
применяется здесь.
Чтобы захватить вывод, вместо этого вы должны использовать subprocess.check_output()
, который принимает аналогичные аргументы. Из документации:
>>> subprocess.check_output(
... "ls non_existent_file; exit 0",
... stderr=subprocess.STDOUT,
... shell=True)
'ls: non_existent_file: No such file or directory\n'
subprocess.PIPE
. Этот метод также импортирует все в модуль подпроцесса.from subprocess import PIPE
вводит в текущее пространство имен, так что вы можете использовать толькоPIPE
. – jro 12 December 2011 в 17:54communicate
считывает данные до тех пор, пока не будет получен EOF. Если вы хотите динамически взаимодействовать с процессом, обратитесь к каналу, используяp.stdin.write('data')
. Для чтения см. Мой предыдущий комментарий. Предупреждение об этом способе общения, так что будьте осторожны, вы не заполняете буферы. Самый простой способ проверить это - просто попробовать ... – jro 13 December 2011 в 11:04p.communicate(input="data for input".encode())
– qed 9 November 2014 в 03:16