繁体   English   中英

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

[英]Communicate with a process multiple times without terminating it

我有一个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之后发送输入,重复这个过程?

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

import subprocess

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

要回答标题中的问题,看到的说明链接subprocess标签下的部分: 一个子交互,同时它仍在运行的代码示例如使用pexpectsubprocess

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM