grep stdin 和 bc stdin 之间有什么不同吗?
Is there is any different between grep stdin and bc stdin?
tornado 中有一些类似 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'
,永远不会return挂断。
input: abcdefg
return:
(hanging up)
我猜想 bc
的标准输入和 grep
的标准输入之间有什么区别。谁能告诉我为什么?非常感谢。
这两个命令的标准输入没有区别。区别在于 bc
读取一行输入并立即打印结果。 grep
默认情况下会缓冲输出,因此您不会立即看到输出。
您可以尝试将 --line-buffered
选项传递给 grep,它将立即输出每一行。
您还应该记住,grep
可能不会为每一行输出生成一行输出。这意味着,如果您读取被 grep
过滤掉的行,您的程序将在尝试读取输出时挂起(因为没有任何输出)。
tornado 中有一些类似 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'
,永远不会return挂断。
input: abcdefg
return:
(hanging up)
我猜想 bc
的标准输入和 grep
的标准输入之间有什么区别。谁能告诉我为什么?非常感谢。
这两个命令的标准输入没有区别。区别在于 bc
读取一行输入并立即打印结果。 grep
默认情况下会缓冲输出,因此您不会立即看到输出。
您可以尝试将 --line-buffered
选项传递给 grep,它将立即输出每一行。
您还应该记住,grep
可能不会为每一行输出生成一行输出。这意味着,如果您读取被 grep
过滤掉的行,您的程序将在尝试读取输出时挂起(因为没有任何输出)。