Flo*_*vić 7 python subprocess stanford-nlp python-multithreading
我试图创建一个python进程,读取一些输入,处理它并打印出结果.处理由子流程(斯坦福大学的NER)完成,对于ilustration,我将使用'cat'.我不确切知道NER会给出多少输出,所以我使用一个单独的线程来收集它并打印出来.以下示例说明.
import sys
import threading
import subprocess
# start my subprocess
cat = subprocess.Popen(
['cat'],
shell=False, stdout=subprocess.PIPE, stdin=subprocess.PIPE,
stderr=None)
def subproc_cat():
""" Reads the subprocess output and prints out """
while True:
line = cat.stdout.readline()
if not line:
break
print("CAT PROC: %s" % line.decode('UTF-8'))
# a daemon that runs the above function
th = threading.Thread(target=subproc_cat)
th.setDaemon(True)
th.start()
# the main thread reads from stdin and feeds the subprocess
while True:
line = sys.stdin.readline()
print("MAIN PROC: %s" % line)
if not line:
break
cat.stdin.write(bytes(line.strip() + "\n", 'UTF-8'))
cat.stdin.flush()
Run Code Online (Sandbox Code Playgroud)
当我用键盘输入文本时,这似乎很有效.但是,如果我尝试将输入传递到我的脚本(cat file.txt | python3 my_script.py),则似乎会出现竞争条件.有时我会得到适当的输出,有时不会,有时它会锁定.任何帮助,将不胜感激!
我正在运行Ubuntu 14.04,python 3.4.0.解决方案应该是独立于平台的.
在末尾添加th.join(),否则当主线程退出时,您可能会在线程处理完所有输出之前提前终止线程:守护线程不会在主线程中存活(或删除th.setDaemon(True)而不是th.join())。