【问题标题】:Using pipes to communicate interactively doesn't work. I tried flush() too. What am I doing wrong?使用管道进行交互通信是行不通的。我也试过flush()。我究竟做错了什么?
【发布时间】:2025-12-28 12:25:11
【问题描述】:

有一个父母和一个孩子,他们通过管道连接。父级从子级进行非阻塞读取,并在子级管道上进行阻塞写入。此外,我将 select() 与超时一起用于非阻塞读取。

父代码:

import os
import sys
from time import sleep
import signal
import fcntl
from select import select
from subprocess import Popen, PIPE

p = Popen(['python', 'bot2.py'],stdout=PIPE, stdin=PIPE, close_fds=True)

flg = fcntl.fcntl(p.stdout.fileno(), fcntl.F_GETFL)
fcntl.fcntl(p.stdout.fileno(), fcntl.F_SETFL, flg | os.O_NONBLOCK)

for i in range(5):
    p.stdin.write('hello world {}\n'.format(i))
    p.stdin.flush()
    # sleep(2.0)
    ready = select([p.stdout.fileno()], [], [], 5.0)
    if len(ready) == 1:
        print 'msg from bot: {}'.format(os.read(p.stdout.fileno(), 100))
    else:
        print "The bot did not print anything"
os.kill(p.pid, signal.SIGTERM)

子代码 (bot2.py)

import os
import sys
from time import sleep
from select import select

sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
while True:
    a = raw_input()
    print a
    sys.stdout.flush()

目标是在进程之间建立连接,以便它们可以交替读取和写入管道。我认为 flush() 没有做这项工作。我尝试使用python -u 将缓冲区大小设置为零。我做错了什么?

【问题讨论】:

    标签: python python-2.7 pipe popen


    【解决方案1】:

    select() 返回准备好的对象列表的三元组。所以,在你的情况下,len(ready) 总是返回 3。如果你想从孩子那里读,它应该是 len(ready[0])

    【讨论】:

      最近更新 更多