小编典典

将大量数据写入标准输入

python

我正在向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开始,则不会发生错误


阅读 222

收藏
2020-12-20

共1个答案

小编典典

为避免以可移植的方式出现死锁,请在单独的线程中写入子代:

#!/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:从subprocess.communicate()读取流输入

2020-12-20