Python 使用管道进行交互通信是行不通的。我也试过了。我做错了什么?

Python 使用管道进行交互通信是行不通的。我也试过了。我做错了什么?,python,python-2.7,pipe,popen,Python,Python 2.7,Pipe,Popen,有一个父级和一个子级,它们通过管道连接。父对象对子对象执行非阻塞读取,同时对子对象的管道执行阻塞写入。此外,对于非阻塞读取,我使用select with timeout 父级的代码: import os import sys from time import sleep import signal import fcntl from select import select from subprocess import Popen, PIPE p = Popen(['python', 'bot

有一个父级和一个子级,它们通过管道连接。父对象对子对象执行非阻塞读取,同时对子对象的管道执行阻塞写入。此外,对于非阻塞读取,我使用select with timeout

父级的代码:

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将缓冲区大小设置为零。我做错了什么?

选择返回三个准备就绪的对象列表。所以,在你的情况下,lenready总是返回3。如果您试图从该子级读取,则应改为lenready[0]