首页 > 解决方案 > 如何在 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

我从 cmd: 执行,-$ python adder.py < in.txt > out.txt out.txt 是:

15
10
3

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

标签: pythoncommand-line-interfacestdoutstdin

解决方案


在代码中使用 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
...

推荐阅读