Есть ли разница между grep stdin и bc stdin? - PullRequest
0 голосов
/ 29 июня 2018

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

1 Ответ

0 голосов
/ 29 июня 2018

Нет разницы между стандартным вводом двух команд. Разница в том, что bc читает одну строку ввода и сразу печатает результат. grep вывод буферизован по умолчанию, поэтому вы сразу не увидите вывод.

Вы можете попробовать передать параметр --line-buffered в grep, который будет выводить каждую строку немедленно.

Также следует помнить, что grep может не выдавать строку вывода для каждой строки вывода. Это означает, что если вы читаете в строке, отфильтрованной по grep, ваша программа будет зависать, пытаясь прочитать выходные данные (поскольку их нет).

...