首页 > 解决方案 > grep stdin 和 bc stdin 之间有什么不同吗?

问题描述

有一些类似os.dup2龙卷风的代码。它将raw_input()内容重定向到子流程中。

import os,sys
from tornado.ioloop import IOLoop
from tornado.gen import coroutine
from tornado.process import Subprocess as sp

@coroutine
def run(cmd):
    ioloop = IOLoop().current()
    proc = sp(cmd,shell=True,stdin=sp.STREAM, stdout=sp.STREAM, stderr=sp.STREAM)
    while 1:
        proc.stdin.write(raw_input('input: ')+'\n')
        print 'return: ', (yield proc.stdout.read_bytes(1024,partial=True)).strip()



IOLoop().current().run_sync(lambda :run(sys.argv[1]))

如果我们像这样运行 bc 命令python test.py bc,它将如下所示:

# python sa.py bc
input: 1+1
return:  2
input:

但是,如果我运行python test.py 'grep abc',将永远不会返回任何东西并挂断。

input: abcdefg
return:  
(hanging up)

bc我想这在's stdin 和's stdin之间有一些区别grep。谁能告诉我为什么?非常感谢。

标签: pythongrepsubprocesstornadostdin

解决方案


两个命令的标准输入没有区别。不同之处在于bc读取一行输入并立即打印结果。grep默认情况下会缓冲输出,因此您不会立即看到输出。

您可以尝试将--line-buffered选项传递给 grep,它将立即输出每一行。

您还应该记住,grep可能不会为每一行输出产生一行输出。这意味着如果您读入被 过滤掉的行grep,您的程序将在尝试读取输出时挂起(因为没有任何输出)。


推荐阅读