7

ファイル sp.py:

#!/usr/bin/env python3
s = input('Waiting for your input:')
print('Data:' + s)

ファイル main.py

import subprocess as sp
pobj = sp.Popen('sp.py',stdin=sp.PIPE,stdout=sp.PIPE,shell=True)
print(pobj.stdout.read().decode())
pobj.stdin.write(b'something...')
print(pobj.stdout.read().decode())

pobj.stdout.read()sp.py が私を待っているので、 main.py は最初の でブロックします。
しかし、文字列 'Waiting for you input:' を最初に処理したい場合、sp.py が私を待っているかどうかを知るにはどうすればよいでしょうか?
つまり、pobj.stdout.read()sp.py が待機している (または のためにスリープしているtime.sleep()) ときに が返されるようにします。

4

1 に答える 1

2

さて、私はそれを解決しました。私のコードは、Python の subprocess.PIPE での非ブロッキング読み取りに基づいています(ありがとう、@VaughnCato)

#!/usr/bin/env python3
import subprocess as sp
from threading import Thread
from queue import Queue,Empty
import time

def getabit(o,q):
    for c in iter(lambda:o.read(1),b''):
        q.put(c)
    o.close()

def getdata(q):
    r = b''
    while True:
        try:
            c = q.get(False)
        except Empty:
            break
        else:
            r += c
    return r

pobj = sp.Popen('sp.py',stdin=sp.PIPE,stdout=sp.PIPE,shell=True)
q = Queue()
t = Thread(target=getabit,args=(pobj.stdout,q))
t.daemon = True
t.start()

while True:
    print('Sleep for 1 second...')
    time.sleep(1)#to ensure that the data will be processed completely
    print('Data received:' + getdata(q).decode())
    if not t.isAlive():
        break
    in_dat = input('Your data to input:')
    pobj.stdin.write(bytes(in_dat,'utf-8'))
    pobj.stdin.write(b'\n')
    pobj.stdin.flush()
于 2012-08-30T15:08:14.197 に答える