[英]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
标签下的部分: 一个子交互,同时它仍在运行的代码示例如使用pexpect
和subprocess
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.