Передайте переменную команде bash с помощью Python

1

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

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 как переменной?

  • 0
    Проверьте stderr . Возможно, он пытается сказать вам, что не так.
  • 0
    Нет ничего плохого. Код выполняется с выходом 0. Но это похоже на то, что переменная не видна командой.
Показать ещё 8 комментариев
Теги:
variables
cygwin

2 ответа

0

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

Вместо

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

использование

p = Popen("/bin/bash.exe", stdin=PIPE, stdout=PIPE)
  • 0
    Да конечно. Но проблема остается. Я обновил вопрос, чтобы быть более понятным.
0

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 впоследствии.

  • 0
    Также следует отметить, что оболочка использует stderr для вывода вашей команды обратно к вам.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню