Вопрос или проблема
У меня есть файл на Python с названием process.py
, который принимает ввод пользователя по одной строке с помощью функции input следующим образом и выводит первую букву ввода.
first_letter = []
for i in range(3):
word = input("> ")
l = word[0].upper()
first_letter.append(l)
print(f"{i}:{l}")
print("".join(first_letter))
У меня есть текстовый файл с названием tmp_in.txt
, который передается на вход в файл Python, чтобы имитировать ввод пользователя.
apple
banana
cherry
Существует ли способ показать ввод вместе с выводом в консоли или перенаправить в файл? Чтобы вывод выглядел так:
> apple
0: A
> banana
1: B
> cherry
2: C
ABC
Команды Bash или использование другого оберточного файла Python подходят, но оригинальный файл Python process.py
не может быть изменен. Ввод в process.py
также может не иметь “>” в качестве текста подсказки (то есть это может быть “”, “Введите слово здесь:”, и т. д.)
Я пробовал использовать команду bash cat tmp_in.txt | tee /dev/tty | python process.py
, но это просто выводит файл ввода целиком сначала, а затем вывод, как показано ниже:
apple
banana
cherry> 0:A
> 1:B
> 2:C
ABC
Ответ или решение
Чтобы одновременно отобразить ввод из файла и вывод Python-скрипта в терминале при использовании Bash, можно воспользоваться командой sponge
из пакета moreutils
. Этот подход позволяет перехватывать ввод и вывод программы, чтобы параллельно отображать вводимые строки.
Шаги для реализации:
-
Установите пакет
moreutils
, если он еще не установлен. На большинстве систем на базе Debian/Ubuntu вы можете сделать это с помощью:sudo apt-get install moreutils
-
Создайте оболочку (обертку) для выполнения вашего скрипта.
Можно создать временный Bash-скрипт, который будет выводить каждую строку из файла
tmp_in.txt
перед тем, как передать её скриптуprocess.py
.Сохраните следующий код в файл, например
wrapper.sh
:#!/bin/bash while IFS= read -r line; do # Печатаем приглашение и введенное слово: echo "> $line" # Передаем введенное слово в Python-скрипт и получаем его результат: echo "$line" | python process.py done < tmp_in.txt
-
Сделайте скрипт исполняемым.
Используйте команду:
chmod +x wrapper.sh
-
Запустите ваш скрипт-обертку.
В терминале выполните:
./wrapper.sh
Ожидаемый вывод:
Запуск wrapper.sh
должен вывести в терминал следующее:
> apple
0: A
> banana
1: B
> cherry
2: C
ABC
Объяснение решения:
- Скрипт
wrapper.sh
читаетtmp_in.txt
строка за строкой с помощью циклаwhile
. - Каждая строка выводится на экран с заданным форматом (строка начинается с
>
), что симулирует введение пользователем. - Далее каждая строка передается в Python-скрипт
process.py
, который обрабатывает ввод и выводит результат, который также появляется в терминале.
Этот метод позволяет оставаться в рамках ограничений задачи: вы не изменяете process.py
, а только обрабатываете ввод и вывод через обертку на Bash.
Такое решение удобно для мониторинга и отладки, позволяя видеть, как ваш Python-скрипт обрабатывает данные в реальном времени.