如何从Python子进程收集输出

时间:2015-05-26 07:00:30

标签: 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()

当我用键盘输入文字时,这似乎很有效。但是,如果我尝试将输入传递到我的脚本(cat file.txt | python3 my_script.py),则似乎会出现竞争条件。有时我会得到适当的输出,有时不会,有时它会锁定。任何帮助将不胜感激!

我正在运行Ubuntu 14.04,python 3.4.0。解决方案应该与平台无关。

1 个答案:

答案 0 :(得分:2)

最后添加th.join()否则你可能会在主线程退出时处理所有输出之前过早杀死线程:守护程序线程不能在主线程中存活(或删除th.setDaemon(True)而不是th.join())。