python – 将大量数据写入stdin

我正在向stdin写入大量数据.

我如何确保它不会阻塞?

p=subprocess.Popen([path],stdout=subprocess.PIPE,stdin=subprocess.PIPE)
p.stdin.write('A very very very large amount of data')
p.stdin.flush()
output = p.stdout.readline()

在我读取一个大字符串并写入之后,它似乎挂在p.stdin.write()上.

我有一大堆文件,将按顺序写入stdin(> 1k文件)

所以会发生的是我正在运行一个循环

#this loop is repeated for all the files
for stri in lines:
p=subprocess.Popen([path],stdout=subprocess.PIPE,stdin=subprocess.PIPE)
p.stdin.write(stri)
output = p.stdout.readline()
#do some processing

它以某种方式挂起在文件号. 400.该文件是一个包含长字符串的大文件.

我怀疑它是一个阻塞问题.

只有当我从0迭代到1000时才会发生这种情况.但是,如果我从文件400开始,则不会发生错误

解决方法:

要以可移植的方式避免死锁,请在单独的线程中写入子进程:

#!/usr/bin/env python
from subprocess import Popen, PIPE
from threading import Thread

def pump_input(pipe, lines):
    with pipe:
        for line in lines:
            pipe.write(line)

p = Popen(path, stdin=PIPE, stdout=PIPE, bufsize=1)
Thread(target=pump_input, args=[p.stdin, lines]).start()
with p.stdout:
    for line in iter(p.stdout.readline, b''): # read output
        print line,
p.wait()

Python: read streaming input from subprocess.communicate()

上一篇:Python:响应命令行提示


下一篇:7-2 堆栈操作合法性 (20 分) C++