В торнадо есть такой код, как 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
и стандартным grep
. Кто-нибудь может сказать мне, почему? Большое спасибо.