使用python子进程管道非常长的字符串管道

时间:2011-02-13 00:57:07

标签: python subprocess

我想使用python的子进程库来处理字符串,在不同的程序中处理这个字符串,然后收集并保存它。不幸的是,这个字符串非常长(如数百万个字符长)。所以我设置了以下代码段:

cmd = ['some command']
p1 = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
result = p1.communicate(input='some string')

其中'some string'实际上是数百万个字符。

我总是得到这个错误:

OSError: [Errno 32] Broken pipe

我已经在较短的字符串上尝试了它并且代码有效,所以我猜我正在最大化管道缓冲区。

有没有合理的解决方案,而不必诉诸创建临时文件?

有几个限制使得使用subprocess成为我现在最有吸引力和最简单的解决方案,这就是为什么我想在python和subprocess中找到解决方案。

2 个答案:

答案 0 :(得分:4)

断管也可能意味着儿童过程因其他原因而死亡。输入无效或内存不足可能是罪魁祸首。您是否尝试过将命令更改为像cat这样的东西?

答案 1 :(得分:0)

如果您通过输入发送数百万个字符,那么程序的体系结构显然有问题。通常在这些情况下,程序会读取这些输入的块。

话虽如此,有可能将文件用作STDIN用于子进程。对于大输入,这可能会导致同样的问题。

如果没有Python / subprocess,你如何将这么长的输入传递给你的程序?

>>> import subprocess
>>> fo = open('filewithinput')
>>> proc = subprocess.Popen(['cat'],stdin=fo,stdout=subprocess.PIPE)
>>> out,err = proc.communicate()
>>> fo.close()
>>> print out