После выполнения cmd команды через os.popen необходимо автоматически вводить ответ в stdin
Программа запускает cmd команду comp "{path_1}" "{path_2}, а та в свою очередь пишет в stderr (в cmd выводится: Сравнить другие файлы [Y(да)/N(нет)] ?), после чего ожидает ввода информации в stdin со стороны пользователя в cmd. Вопрос: можно ли как-то перенаправить ввод, чтобы автоматически вписывать ответ в консоль без человеческого участия? (попытки print(sys.stdin.write('N')) не привели к желаемому результату)
import os
import sys
import subprocess
def run_command(command):
process = subprocess.Popen(command, stdin=subprocess.PIPE)
data = process.communicate()
for line in data:
cur_line = line.encode('cp1251').decode("cp866")
if 'Не удается найти или открыть' in cur_line:
print(sys.stdin.write('N'))
elif 'Различия не найдены' in cur_line:
continue
else:
print(cur_line)
command = "dir /B /S /AD"
dirs_inside = [line.encode('cp1251').decode("cp866") for line in os.popen(command)]
for dir_ in enumerate(dirs_inside):
dirs_inside[dir_[0]] = dir_[1][:-1]
cur_dir = os.getcwd()
all_dirs = [cur_dir] + dirs_inside
disk = 'H'
command_template = 'comp "{path_1}" "{path_2}"'
for dir_ in all_dirs:
path1 = disk + dir_[1:]
path2 = dir_
cur_command = command_template.format(path_1=path1, path_2=path2)
print(cur_command)
run_command(['comp', path1, path2])
Ответы (1 шт):
Попробуйте так:
out, err = process.communicate(input='N', timeout=3)
Вот в документации подробней. Насчет попытки sys.stdin.write() есть такое предупреждение:
Warning Use communicate() rather than .stdin.write, .stdout.read or .stderr.read to avoid deadlocks due to any of the other OS pipe buffers filling up and blocking the child process.