У меня есть следующий код:
from subprocess import Popen, PIPE
p = Popen("C:/cygwin64/bin/bash.exe", stdin=PIPE, stdout=PIPE)
path = "C:/Users/Link/Desktop/folder/"
p.stdin.write(b"cd " + str.encode(path)))
p.stdin.close()
out = p.stdout.read()
print(out)
output
равен b''
Есть ли способ передать переменную команде bash p.stdin.write(b"cd " + path)
Я спрашиваю, потому что то, как написано выше, не работает. Результат равен нулю, как и началось Cygwin, и ничего больше.
РЕДАКТИРОВАТЬ
Пока я вижу, что вопрос не так ясен, я добавлю этот сценарий:
Я нахожусь в Windows, и я использую Python 3.6. У меня есть bash cmd, который требует выполнения Cygwin. Этот cmd может содержать переменную в своей строке, которая будет изменяться после каждого выполнения. Импортируйте цикл for
который выполняет команду.
Например (команда ImageMagick):
convert image.jpg -resize 1024x768 output_file.jpg
Как я могу выполнить этот cmd из Python с переменной output_file.jpg
как переменной?
Как кажется, вы используете питон Cygwin, чем вы должны использовать правильные пути Posix, а не Windows-подобные
Вместо
p = Popen("C:/cygwin64/bin/bash.exe", stdin=PIPE, stdout=PIPE)
использование
p = Popen("/bin/bash.exe", stdin=PIPE, stdout=PIPE)
Bash не запускается в интерактивном режиме по умолчанию, если не обнаруживает, что стандартный вход и выход подключены к терминалу. Вы PIPE
d их, поэтому они определенно не подключены к терминалу.
Bash не отображает никаких подсказок в режиме -i nteractive, поэтому вы ничего не видите. Вы можете заставить его быть интерактивным с переключателем -i
.
Однако даже тогда он не собирается писать в stdout
но stderr
; вы можете попробовать stingr трубопровода 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
впоследствии.
stderr
. Возможно, он пытается сказать вам, что не так.