gpt4 book ai didi

python - 使用管道进行交互式通信是行不通的。我也尝试过flush()。我究竟做错了什么?

转载 作者:太空宇宙 更新时间:2023-11-03 15:43:50 25 4
gpt4 key购买 nike

有一个父级和一个子级,它们通过管道连接。父级对子级进行非阻塞读取,并对子级管道进行阻塞写入。此外,我使用带有超时的 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 将缓冲区大小设置为零。我做错了什么?

最佳答案

select()返回准备好的对象列表的三元组。所以,就你而言len(ready)总是返回 3。它应该是 len(ready[0])如果您想从 child 那里阅读。

关于python - 使用管道进行交互式通信是行不通的。我也尝试过flush()。我究竟做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41930505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com