python - 如何在 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
我的问题是,我怎样才能流式传输/缓冲输入和输出,以不断地与程序通信,而不必一次又一次地创建和读取文件?
解决方案
在代码中使用 bash 管道和两个不同的函数
尝试使用这种方法重新考虑您的程序。
./mycode.py -gen | sqlite3 | ./mycode.py -proc
您的程序将接受一个用于选择行为的命令行参数
(从 SQL 生成输入或处理输出)字符
|
是 Bash 中的管道操作数处理 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
...