python - grep stdin 和 bc 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]))
如果我们像这样运行 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
我想这在's stdin 和's stdin之间有一些区别grep
。谁能告诉我为什么?非常感谢。
解决方案
两个命令的标准输入没有区别。不同之处在于bc
读取一行输入并立即打印结果。grep
默认情况下会缓冲输出,因此您不会立即看到输出。
您可以尝试将--line-buffered
选项传递给 grep,它将立即输出每一行。
您还应该记住,grep
可能不会为每一行输出产生一行输出。这意味着如果您读入被 过滤掉的行grep
,您的程序将在尝试读取输出时挂起(因为没有任何输出)。
推荐阅读
- javascript - 执行功能后如何显示组件?
- react-navigation - 直接导航到 StackNavigator 的底部屏幕,同时为中间屏幕提供参数
- javascript - index.js 的单元测试功能
- oracle - 在不满足条件的情况下获取所有记录
- javascript - Mapbox 使用哪个投影
- java - 如何在向亚马逊 MWS 提交 Feed 时修复“格式错误的 xml”错误?
- php - 在 Symfony 中反序列化 JSON 响应
- puppeteer - Puppeteer:如何将默认浏览器上下文设置为隐身模式?
- javascript - 如何创建动态 HTTP 请求路径
- c# - 格式化可变小数位数