Python STDIN readline 阻塞

2 投票
2 回答
3302 浏览
提问于 2025-04-30 21:20

我有一个脚本,它会像这样输出信息到标准输出:

# 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

撰写回答