我已经运行,可以采取任何文本输入与标准输入“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