2017-01-30 6 views
1

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?

Antwort

1

select() gibt ein Tripel der Liste der Objekte zurück, die bereit sind. Also, in Ihrem Fall immer 3 zurück. Es sollte stattdessen sein, wenn Sie versuchen, von dem Kind zu lesen.