Вы можете достичь этого, если ваша команда сама является оболочкой, но не если это команда, которая либо завершает работу (как pwd
), либо выполняет команду, которая захватывает stdin как свой собственный ввод. Следующее должно работать - обратите внимание, что вам не нужно shell=True
, и что вам нужно грипп sh записи в stdin
:
from subprocess import Popen, PIPE
p1 = subprocess.Popen('bash', stdin=PIPE, text=True)
p1.stdin.write("xeyes\n")
p1.stdin.flush()
Вы можете отслеживать это более точно, выполнив, например, :
p1 = subprocess.Popen('pwd', shell=True, stdin=PIPE, text=True)
p1.pid
Затем, глядя на идентификатор процесса в оболочке:
ps -ef |grep <PID>
Вы увидите: sh <defunct>
, который показывает, что процесс мертв и больше не доступен для связи (но все равно обнаруживается, поскольку python содержит ссылку на него, которая исчезает при выходе из python).
Если вы попытаетесь написать в stdin, вы получите:
BrokenPipeError: [Errno 32] Разбитая труба