当前位置: 首页 > 面试题库 >

将大量数据写入标准输入

淳于涛
2023-03-14
问题内容

我正在向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:从subprocess.communicate()读取流输入



 类似资料:
  • 问题内容: 我知道PHP通常用于web开发,那里 是 没有标准的输入,但是PHP声称是可用作通用脚本语言,如果你遵循它的古怪基于web的约定。我知道PHP可以使用和打印到(或任何您想调用的东西),这很简单,但是我想知道PHP脚本如何从(特别是使用,但是任何输入函数都可以)从中获取输入,或者这甚至可能吗? 问题答案: 可以通过创建一个文件句柄来读取,然后用来读取它,例如使用一行(或者,您已经说过,使

  • 我们已经见过好几个示例使用 stdin 了。这也应该是 logstash 里最简单和基础的插件了。 所以,在这段中,我们可以学到一些未来每个插件都会有的一些方法。 配置示例 input { stdin { add_field => {"key" => "value"} codec => "plain" tags => ["add"]

  • 问题内容: 是否可以在Python 2.6中将stdin读取为二进制数据?如果是这样,怎么办? 我在Python 3.1文档中 看到这很简单,但是在2.6中执行此操作的工具似乎并不存在。 如果3.1中描述的方法不可用,是否有办法关闭stdin并以二进制模式重新打开? 更新资料 为了清楚起见,我在MS-DOS外壳程序中使用“类型”将二进制文件的内容传递给我的python代码。据我了解,这应该等效于U

  • 问题内容: 我目前正在编写一个使用BufferedWriter生成多个日志文件的应用程序。但是,在调试时,我想写入System.out而不是文件。我认为我可以从以下方面进行更改: 至: 相对于: 但是,新选项无法正常工作。我如何只更改BufferedWriter构造函数内部的对象,以从文件重定向到标准输出。由于我将要写入多个日志文件,因此实际上无法使用System.out并将输出更改为文件。 问题

  • 回顾一下我们写的第一个 Rust 程序就是带副作用的,其副作用就是向标准输出(stdout),通常是终端或屏幕,输出了 Hello, World! 让屏幕上这几个字符的地方点亮起来。println! 宏是最常见的输出,用宏来做输出的还有 print!,两者都是向标准输出(stdout)输出,两者的区别也一眼就能看出。至于格式化输出,基础运算符和字符串格式化小节有详细说明,这里就不再啰嗦了。 更通用

  • 问题内容: 我有以下代码,该代码执行外部命令并将两个字段输出到控制台,等待用户输入。一个用于用户名,另一个用于密码,然后我手动添加了它们。 谁能给我一个关于如何写stdin以便从程序内部输入这些输入的提示吗? 对我而言,最棘手的部分是有两个不同的字段在等待输入,而我很难弄清楚如何一个接一个地填充。 解: 问题答案: 我想您可以为此使用a 。像这样: 诀窍是,它只是一个char缓冲区,并且在读取凭据