我有一些数据,我想gzip,uuencode,然后打印到标准输出。我基本上有:

compressor = Popen("gzip", stdin = subprocess.PIPE, stdout = subprocess.PIPE)
encoder    = Popen(["uuencode", "dummy"], stdin = compressor.stdout)

我将数据输入到压缩器的方式是通过compressor.stdin.write(stuff)。
我真正需要做的是送一个EOF到压缩机,我不知道怎么做。
在某种程度上,我尝试了compressor.stdin.close(),但这不起作用——当compressor直接写入文件时,它工作得很好,但在上面的情况下,进程不会终止并在compressor.wait()上暂停。
建议?在本例中,gzip就是一个例子,我真的需要做一些事情,将一个进程的输出管道化到另一个进程。
注意:我需要压缩的数据不适合内存,所以在这里通信不是一个好的选择。还有,如果我跑
compressor.communicate("Testing")

在上面两行之后,它仍然挂起错误
文件“/usr/lib/python2.4/subprocess.py”,第1041行,通信中
rlist,wlist,xlist=select.select(读设置,写设置,[])

最佳答案

我怀疑问题出在你打开管道的顺序上。UUEncode很有趣,当你启动它时,如果没有正确的方式进入管道,它会发出呜呜声(试着在Popen调用中启动它自己的该死的东西,以查看只有管道作为stdin和stdout的爆炸)
试试这个:

encoder = Popen(["uuencode", "dummy"], stdin=PIPE, stdout=PIPE)
compressor = Popen("gzip", stdin=PIPE, stdout=encoder.stdin)

compressor.communicate("UUencode me please")
encoded_text = encoder.communicate()[0]
print encoded_text

begin 644 dummy
F'XL(`%]^L$D``PL-3<U+SD])5<A-52C(24TL3@4`;2O+"!(`````
`
end

你说得对,顺便说一句。。。没有办法把一个通用的EOF发送到管道上。毕竟,每个程序都定义了自己的EOF。方法是关闭管道,就像你想做的那样。
编辑:我应该更清楚uuencode。作为一个shell程序,它的默认行为是期望控制台输入。如果在没有“活动”传入管道的情况下运行它,它将阻止等待控制台输入。在你把材料送到压缩管道之前,打开编码器第二次,编码器就阻塞了,等着你开始打字。杰鲁布说有东西挡住了。

09-16 08:39