Bash не запускается в интерактивном режиме по умолчанию, если только он не обнаруживает, что стандартный вход и выход подключены к терминалу.Вы PIPE
сделали это, поэтому они определенно не подключены к терминалу.
Bash не отображает никаких запросов в неинтерактивном режиме, поэтому вы ничего не видите.Вы можете принудительно сделать его интерактивным с помощью переключателя -i
.
Однако даже тогда он не будет записывать в stdout
, а stderr
;вы можете попробовать передать stderr в stdout
from subprocess import Popen, PIPE, STDOUT
p = Popen(["C:/cygwin64/bin/bash.exe", "-i"], stdin=PIPE, stdout=PIPE, stderr=STDOUT)
, и вы получите запросы и тому подобное.
Или используйте свой оригинальный подход с командой, которая производит вывод - здесь pwd
, которая печатаеттекущий рабочий каталог:
p.stdin.write(b"cd " + path.encode() + b"\n")
p.stdin.write(b"pwd")
С таким интерактивным процессом сложно разговаривать, хотя - читай слишком мало => тупик.Напишите слишком много => тупик.Вот почему Popen
имеет метод .communicate
для одновременного ввода всех данных и последующего получения stdout
и stderr
.