Передайте переменную в команду bash с помощью Python - PullRequest
0 голосов
/ 23 октября 2018

У меня есть следующий код:

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, и ничего больше.

EDIT

Пока вопрос не так понятен, я добавлю такой сценарий:

Я на Windows и использую Python 3.6.У меня есть bash cmd, который требует Cygwin для выполнения.Этот cmd может иметь переменную в своей строке, которая будет меняться после каждого выполнения.Представьте себе цикл for, который выполняет команду.

Например (команда ImageMagick):

convert image.jpg -resize 1024x768 output_file.jpg

Как выполнить этот cmd из Python с output_file.jpg в качестве переменной?

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Поскольку кажется, что вы используете Python Cygwin, вам следует использовать правильные пути Posix, а не Windows-подобные

Вместо

p = Popen("C:/cygwin64/bin/bash.exe", stdin=PIPE, stdout=PIPE)

используйте

p = Popen("/bin/bash.exe", stdin=PIPE, stdout=PIPE)
0 голосов
/ 23 октября 2018

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...