Es gibt ein Elternteil und ein Kind, sie sind über Rohre verbunden. Das übergeordnete Element führt ein nicht blockierendes Lesen vom untergeordneten Element durch und schreibt auch blockierend in die untergeordnete Leitung. Zusätzlich verwende ich select() mit Timeout für das nicht blockierende Lesen.Die interaktive Verwendung von Pipes funktioniert nicht. Ich habe auch versucht, flush(). Was mache ich falsch?
der Code für die Eltern:
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)
Code für das Kind (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()
das Ziel, eine Verbindung zwischen den Prozessen zu etablieren, so dass sie lesen und schreiben können Rohre alternativ. Ich denke, flush() macht das nicht. Ich habe versucht, python -u
zu verwenden, um die Puffergröße auf Null zu setzen. Was mache ich falsch?