Python STDIN readline 阻塞
我有一个脚本,它会像这样输出信息到标准输出:
# Send.py
import time
while(1):
print "hello"
time.sleep(0.1)
现在我有另一个脚本,需要像这样读取这些信息:
# Listen.py
while(1) :
print "reading.."
data = sys.stdin.read()
print data
python Send.py | python listen.py
可惜的是,这个读取的过程就停在那里,什么也没有打印出来。这是为什么呢?
2 个回答
-1
这是因为程序还没有结束,而read()
正在等待更多的输入输出。管道就像一个阻塞的套接字。
你可能想了解一下Python的队列,并使用get_nowait()
。
这里有一个可能对你有帮助的答案:在Python中对子进程的管道进行非阻塞读取
也可以查一下Python中的阻塞和非阻塞输入输出。
3
read()
方法会一直读取,直到文件结束(EOF),但第一个程序永远不会结束;read()
不会返回。
你需要逐行读取。
把下面这行:
data = sys.stdin.read()
替换成:
data = sys.stdin.readline()
另外,readline()
会返回读取的行,并带有换行符,而 print
语句在字符串后面会加上换行,这样就会在输出中出现空行。为了避免这种情况,可以使用 sys.stdout.write
:
data = sys.stdin.readline()
sys.stdout.write(data)
更新
命令行会缓存输出。为了防止这种情况,可以刷新输出:
import sys
import time
while 1:
print "hello"
sys.stdout.flush()
time.sleep(0.1)
另外,你也可以使用 -u
选项来让标准输出和标准错误输出不缓存。
python -u send.py | python listen.py