Как показать текст файла с входной информацией через конвейер и вывод файла на Python в bash?

Вопрос или проблема

У меня есть файл на 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. Этот подход позволяет перехватывать ввод и вывод программы, чтобы параллельно отображать вводимые строки.

Шаги для реализации:

  1. Установите пакет moreutils, если он еще не установлен. На большинстве систем на базе Debian/Ubuntu вы можете сделать это с помощью:

    sudo apt-get install moreutils
  2. Создайте оболочку (обертку) для выполнения вашего скрипта.

    Можно создать временный 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
  3. Сделайте скрипт исполняемым.

    Используйте команду:

    chmod +x wrapper.sh
  4. Запустите ваш скрипт-обертку.

    В терминале выполните:

    ./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-скрипт обрабатывает данные в реальном времени.

Оцените материал
Добавить комментарий

Капча загружается...