Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多次与进程通信而不终止它_Python_Subprocess_Stdout_Stdin - Fatal编程技术网

Python 多次与进程通信而不终止它

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

我有一个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、读取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)