【发布时间】: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