2011-02-13 52 views
2

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

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

其中'一些字符串'实际上是数百万字符长。

,我总是得到这样的错误:

OSError: [Errno 32] Broken pipe 

我已经试过了在更短的字符串和代码工作,所以我猜我杏的管道缓冲区。

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

有几个约束使得使用子进程对我来说是最有吸引力和最简单的解决方案,这就是为什么我想要在python和子进程中的解决方案。

+0

破管也可能意味着子进程死于其他原因。输入无效或内存不足可能是罪魁祸首。你有没有尝试改变命令,像'猫'? – SpliFF 2011-02-13 01:31:32

+0

@SpliFF拍摄。你是对的。我试过猫和tr,他们都很好。所以这是导致问题的其他程序。谢谢!如果您将评论更改为答案,我很乐意选择它。或者这是毫无意义的? – JasonMond 2011-02-13 01:42:56

+0

不对我,我追逐10k :) – SpliFF 2011-02-13 01:43:46

回答

4

断管还可能意味着子过程死于其他原因。输入无效或内存不足可能是罪魁祸首。你有没有尝试改变命令像猫?

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