grep stdin和bc stdin有什么区别?

时间:2018-06-29 15:36:36

标签: python grep subprocess tornado 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]))

如果我们运行python test.py bc之类的bc命令,它将显示如下:

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

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

input: abcdefg
return:  
(hanging up)

我猜想bc的标准输入和grep的标准输入之间有些区别。谁能告诉我为什么?非常感谢。

1 个答案:

答案 0 :(得分:1)

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

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

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