使用管道运算符在两个 python 脚本之间流式传输多批数据
Streaming multiple batches of data between two python scripts using pipe operator
我想连续地将数据从 script1.py
流式传输到 script2.py
,而不在磁盘上创建中间文件。我正在尝试做的一个例子如下:
script1.py
import time
import sys
for i in range(5):
print i # stream of data
print 'eof' # marker to separate files
sys.stdout.flush()
time.sleep(1)
此脚本的输出完全符合我的要求。 0-4 以一秒睡眠周期打印。
我想script2.py
从script1.py
收集数据,直到字符串'eof',立即写入stdout,等待下一批数据。
script2.py
import time
import sys
data= sys.stdin.read()
sys.stdout.write(data)
sys.stdout.flush()
time.sleep(1)
当我尝试 运行 时:
python script1.py | python script2.py
script2.py
等待来自 script1.py
(0-4) 的全部数据,然后将它们一起写入标准输出,而不是一次写入一个数字。是否可以在 script1.py
的 stdout.flush
之后从 script2.py
输出数据?
更新基于评论:
我无法从 script1.py
调用 script2.py
,因为这两个脚本位于不同的 docker 容器中,我想避免在 docker 中安装 docker =]容器。
一次只读一行 readline
in script2.py
:
import time
import sys
while True:
data = sys.stdin.readline()
sys.stdout.write(data)
sys.stdout.flush()
time.sleep(1)
只要看到 eof
:
就只打印数字的版本
import time
import sys
data = ''
while True:
line = sys.stdin.readline()
if line.strip() != 'eof':
data += line
continue
else:
sys.stdout.write(data)
sys.stdout.flush()
time.sleep(1)
data = ''
我想连续地将数据从 script1.py
流式传输到 script2.py
,而不在磁盘上创建中间文件。我正在尝试做的一个例子如下:
script1.py
import time
import sys
for i in range(5):
print i # stream of data
print 'eof' # marker to separate files
sys.stdout.flush()
time.sleep(1)
此脚本的输出完全符合我的要求。 0-4 以一秒睡眠周期打印。
我想script2.py
从script1.py
收集数据,直到字符串'eof',立即写入stdout,等待下一批数据。
script2.py
import time
import sys
data= sys.stdin.read()
sys.stdout.write(data)
sys.stdout.flush()
time.sleep(1)
当我尝试 运行 时:
python script1.py | python script2.py
script2.py
等待来自 script1.py
(0-4) 的全部数据,然后将它们一起写入标准输出,而不是一次写入一个数字。是否可以在 script1.py
的 stdout.flush
之后从 script2.py
输出数据?
更新基于评论:
我无法从 script1.py
调用 script2.py
,因为这两个脚本位于不同的 docker 容器中,我想避免在 docker 中安装 docker =]容器。
一次只读一行 readline
in script2.py
:
import time
import sys
while True:
data = sys.stdin.readline()
sys.stdout.write(data)
sys.stdout.flush()
time.sleep(1)
只要看到 eof
:
import time
import sys
data = ''
while True:
line = sys.stdin.readline()
if line.strip() != 'eof':
data += line
continue
else:
sys.stdout.write(data)
sys.stdout.flush()
time.sleep(1)
data = ''