将python的一次迭代的管道输出循环到另一个脚本

时间:2017-11-30 17:18:56

标签: python python-2.7 shell docker pipe

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。

1 个答案:

答案 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循环listfor循环可以直接在list元素中迭代:

filenames = glob.glob('*.txt')
for filename in filenames:
    with open(filename, 'rb') as g:
        ...