如何 'catch' Python 中程序的标准输入、标准输出、标准错误?

How to 'catch' stdin, stdout, stderr of a program in Python?

我有一个 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

我从 c​​md 执行:-$ python adder.py < in.txt > out.txt out.txt 是:

15
10
3

我的问题是,我如何流式传输/缓冲输入和输出,以不断与程序通信,而不必一次又一次地创建和读取文件?

在代码中使用 bash 管道和两个不同的函数

尝试用这种方法重新考虑您的程序。

./mycode.py -gen | sqlite3 | ./mycode.py -proc
  1. 您的程序将接受一个选择行为的命令行参数
    (从 SQL 生成输入或处理输出)

  2. 字符|是Bash

  3. 中的流水线操作数
  4. 处理SQL输出的函数必须读取stdin

命令行参数

您必须阅读并验证命令行参数并选择执行两个不同的函数。
看这里How to read/process command line arguments?

Bash 管道

关于 bash

中的管道
command1 | command2

command1 的标准输出通过管道连接到 command2 的标准输入。
示例:echo "my password" | shasum -a 256

从标准输入读取

请参阅此处的几个示例,了解如何阅读标准输入 How do you read from stdin?

示例代码

参见 here 示例代码。 下面是一个示例输出(使用 SQLite 在 macOS 和 Ubunto 中测试):

> ./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
...