for循环的每个实例都会吐出一个二进制文件的内容,该文件应由另一个脚本捕获以进行进一步处理。例如:
script1.py
filename = glob.glob('*.txt')
for i in range(len(filename)):
with open(filename[i], 'rb') as g:
sys.stdout.write(g.read())
script2.py
from subprocess import call
script = "cat > test.fil"
call(script,shell=True)
命令:
python script1.py | python script2.py
如果我执行此命令,它会在将输出汇总到script2.py之前等待所有迭代完成。我希望这可以分批完成。例如,一旦将来自一个二进制文件的数据推送到stdout,就启动script2.py。
无法从script1.py调用script2.py。这两个脚本都需要在不同的docker容器中运行。最好避免在docker容器中安装docker。
答案 0 :(得分:2)
如果sys.stdout
连接到管道,默认情况下它会缓冲。您必须调用sys.stdout.flush()
来刷新输出:
sys.stdout.write(g.read())
sys.stdout.flush()
你的第二个脚本也可以直接读取stdin,而不是唤起shell,唤起cat,阅读它。你写的方式,你正在执行3个进程(python,你的shell,cat)。
import shutil
import sys
with open('test.fil', 'w') as f:
shutil.copyfileobj(sys.stdin, f)
在不相关的注释中,当您打算仅使用该数字来索引时,不需要在数字for
中使用range
循环list
。 for
循环可以直接在list
元素中迭代:
filenames = glob.glob('*.txt')
for filename in filenames:
with open(filename, 'rb') as g:
...