与流程多次通信而不会终止它

时间:2016-02-20 12:16:27

标签: python subprocess stdout stdin

我有一个120k的行文件。每行必须由外部应用程序处理。我启动一个子进程并将每一行发送到stdin。启动应用程序需要至少一秒钟,这是一个真正的瓶颈。

我正在寻找一种方法来实现它,这样我就可以启动一次并逐行发送数据。

我目前的代码:

    #not pictured: the loop that iterates over all lines. Here the text var is the line I need to pass to the application
pdebug("Sending to tomita:\n----\n", text,"\n----")
    try:
        p = Popen(['tomita/tomitaparser.exe', "tomita/config.proto"], stdout=PIPE, stdin=PIPE, stderr=PIPE)
        stdout_data, stderr_data = p.communicate(input=bytes(text, 'UTF-8'), timeout=45)
        pdebug("Tomita returned stderr:\n", "stderr: "+stderr_data.decode("utf-8").strip()+"\n" )
    except TimeoutExpired:
        p.kill()
        pdebug("Tomita killed")
    stdout_data = stdout_data.decode("utf-8")
    facts = parse_tomita_output(stdout_data)
    pdebug('Received facts:\n----\n',str(facts),"\n----")

我最近尝试的代码:

try:
    p = Popen(['tomita/tomitaparser.exe', "tomita/config.proto"], stdout=PIPE, stdin=PIPE, stderr=PIPE)

    for news_line in news:
        pdebug("Sending to tomita:\n----\n", news_line.text,"\n----")
        stdout_data, stderr_data = p.communicate(input=bytes(news_line.text, 'UTF-8'), timeout=45)
        pdebug("Tomita returned stderr:\n",stderr_data.decode("utf-8").strip()+"\n" )
        stdout_data = stdout_data.decode("utf-8")
        facts = parse_tomita_output(stdout_data)
        pdebug('Received facts:\n----\n',str(facts),"\n----")

        news_line.grammemes = facts

except TimeoutExpired:
    p.kill()
    pdebug("Tomita killed due to timeout")

最近的代码产生了这个错误:

  

ValueError:开始通信后无法发送输入

有没有办法在我启动exe,read stdout,flush stdin和stdout之后发送输入,重复这个过程?

1 个答案:

答案 0 :(得分:1)

  

我有一个120k的行文件。   ...   我正在寻找一种方法来实现它,这样我就可以启动一次并逐行发送数据。

import subprocess

with open(filename, 'rb', 0) as input_file:
    subprocess.check_call(external_app, stdin=input_file)

要回答标题中的问题,请参阅Interacting with a subprocess while it is still running部分下subprocess标记说明中的链接,例如代码示例using pexpect and subprocess