Как «поймать» stdin, stdout, stderr программы в Python? - PullRequest
2 голосов
/ 11 марта 2020

У меня есть sql.exe, который имеет интерфейс командной строки, принимает в качестве входных данных запрос sql и печатает результаты. Мне нужно написать программу на Python, которая будет генерировать команды sql, передавать их в качестве входных данных этой программе и читать выходные данные.

Для упражнений я написал игрушечную программу на python, adder.py:

if __name__ == '__main__':
    while True:
        try:
            line = input()
            a, b = line.strip().split()
            c = int(a) + int(b)
            print(c)
        except EOFError:
            exit()
        except:
            continue

Я создал файл in.txt:

10 5
7 3
1 a
2 1

Я выполняю из cmd: -$ python adder.py < in.txt > out.txt, и out.txt:

15
10
3

У меня такой вопрос, как я могу передавать / буферизовать ввод и вывод, чтобы постоянно общаться с программой, и не создавать и читать файлы снова и снова?

1 Ответ

3 голосов
/ 11 марта 2020

Использование bash каналов и двух разных функций в вашем коде

Попробуйте переосмыслить вашу программу с помощью этого подхода.

./mycode.py -gen | sqlite3 | ./mycode.py -proc
  1. Ваша программа примет одну аргумент командной строки, который выбирает поведение
    (сгенерировать ввод или обработать вывод из SQL)

  2. Символ | является операндом конвейера в Bash

  3. Функция, обрабатывающая вывод SQL, должна прочитать stdin

Аргументы командной строки

Вы должны читать и проверять аргументы командной строки и выбирать выполнение двух разных функций.
См. здесь Как читать / обрабатывать аргументы командной строки?

Bash конвейеры

О конвейере в bash

command1 | command2

Стандартный выход command1 подключен через трубу к стандартному входу command2.
Пример: echo "my password" | shasum -a 256

Чтение со стандартного ввода

Вот несколько примеров того, как читать стандартный ввод Как вы читаете из стандартного ввода?

Пример кода

См. здесь пример кода. Ниже приведен пример вывода (протестировано в macOS и Ubunto с использованием SQLite):

> ./mycode.py -gen
SELECT 0 + 0;
SELECT 1 + 2;
SELECT 2 + 4;
...

> ./mycode.py -gen | sqlite3
0
3
6
...

> # ./mycode.py -proc multiply by 10 the stdin
> ./mycode.py -gen | sqlite3 | ./mycode.py -proc
0
30
60
...
...