龙卷风中有一些类似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
的标准输入之间有些区别。谁能告诉我为什么?非常感谢。
答案 0 :(得分:1)
两个命令的标准输入之间没有区别。区别在于bc
读取一行输入并立即打印结果。 grep
默认情况下会缓冲输出,因此您不会立即看到输出。
您可以尝试将--line-buffered
选项传递给grep,它将立即输出每一行。
您还应该记住,grep
可能不会为每一行输出都产生一行输出。这意味着,如果您读入由grep
过滤掉的行,则程序将挂起并尝试读取输出(因为没有任何内容)。