Python的 - 如何在subprocess.Popen分别用两个线程stdin和stdout?(

2019-10-22 11:14发布

我已经运行,可以采取任何文本输入与标准输入“Enter”键结束,并给出一个文本响应及时到标准输出的命令行程序。 现在我有一个包含数千个句子和每行一个句子的文件。 我可以用两个线程,一个用于读取一行此文件中的行,并把它当我运行命令行程序,标准输入,另一个线程用于捕获响应并写入到另一个文件?

对于“发送给标准输入”跟帖:

def readSentence(inpipe, senlines):
    for sen in senlines:
        inpipe.write(sen.strip()+'\n')
    inpipe.close()

对于线程“从标准输出获得”:

def queueResult(outpipe, queue):
    for res in iter(outpipe.readlines()):
        queue.put(res)
    outpipe.close()

主线程,其中所述命令行程序被称为:

def testSubprocess():
    ee = open('sentences.txt', 'r')
    ff = open('result.txt', 'w')
    lines = ee.readlines()
    cmd = ['java', 
           '-cp', 'someUsefulTools.jar', 
           'fooClassThatReadSentenceAndOutputResponse', 
           '-stdin',]   # take input from stdin
    proc = Popen(cmd, stdout=PIPE, stdin=PIPE)
    q = Queue()
    readThread = Thread(target=readSentence, args=(proc.stdin, lines))
    queueThread = Thread(target=queueResult, args=(proc.stdout, q))
    readThread.daemon = True
    queueThread.daemon = True
    readThread.start()
    queueThread.start()

    result = []

    try:
        while not q.empty(): 
            result = result.append(q.get_nowait())
    except Empty:
        print 'No results!'

我打印的输入和输出在用于readSentence()和queueResult()循环(在上面的代码中未示出)。 我发现在最后,输入句子不能完全读取,输出是什么。 有什么能在我的代码去错了吗? 怎样才能做到“标准输入” -thread和“标准输出” -thread之间的同步,使他们能够对工作? 即“标准输入” -thread把一个句子到管道,然后在“标准输出” -Thread得到从管道的结果。

PS我引用此文非阻塞读: 非阻塞阅读在python subprocess.PIPE

文章来源: Python - How do I use two threads for stdin and stdout respectively in subprocess.Popen?