Python 多次与进程通信而不终止它
我有一个120k行的文件。每一行都必须由外部应用程序处理。我启动一个子流程,并将每一行发送到stdin。启动应用程序至少需要一秒钟,这是一个真正的瓶颈 我正在寻找一种方法,使它,所以我可以开始一次的过程,并发送数据到它一行一行 我当前的代码:Python 多次与进程通信而不终止它,python,subprocess,stdout,stdin,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
#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、读取stdout、刷新stdin和stdout之后,是否有方法发送输入,重复这个过程
我有一个120k行的文件。
...
我正在寻找一种方法,使它,所以我可以开始一次的过程,并发送数据到它一行一行
要回答标题中的问题,请参阅“代码示例”部分下的
子流程标记描述中的链接。也许?@JoachimIsaksson谢谢。我的问题是程序在stdout中没有一个清晰的“我已经完成了对这段代码的解析”标记。不过它会将一个发送到stderr。您可能可以使用subprocess.Popen
执行此操作,但这取决于tomitaparser.exe的缓冲。您不能使用子流程进行通信,这是与流程的一次性交互。您可以使用p.stdin
,p.stdout
,p.stderr
,假设每个stdin
,stdout
,获取管道的句柄,和stderr
args to。Popen
被设置为subprocess.PIPE
。请注意,pexpect
减少了Windows上的功能:可能重复
import subprocess
with open(filename, 'rb', 0) as input_file:
subprocess.check_call(external_app, stdin=input_file)