【发布时间】:2011-08-27 21:14:39
【问题描述】:
我正在将一个 bash 脚本移植到 python 2.6,并且想要替换一些代码:
cat $( ls -tr xyz_`date +%F`_*.log ) | filter args > bzip2
我想我想要类似于http://docs.python.org/release/2.6/library/subprocess.html 的“替换 shell 管道”示例,唉...
p1 = Popen(["filter", "args"], stdin=*?WHAT?*, stdout=PIPE)
p2 = Popen(["bzip2"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]
但是,我不确定如何最好地提供p1 的stdin 值,以便连接输入文件。看来我可以补充...
p0 = Popen(["cat", "file1", "file2"...], stdout=PIPE)
p1 = ... stdin=p0.stdout ...
...但这似乎超出了使用(缓慢、低效)管道来调用具有重要功能的外部程序的范围。 (任何体面的 shell 都会在内部执行 cat。)
所以,我可以想象一个满足文件对象 API 要求的自定义类,因此可以用于 p1 的标准输入,连接任意其他文件对象。 (编辑:现有答案解释了为什么这是不可能的)
python 2.6 是否有一种机制可以满足这种需求/想要,或者在 python 圈子中是否可以认为另一个 Popen 到 cat 非常好?
谢谢。
【问题讨论】:
-
filter是做什么的?您是否需要为此功能调用外部程序? -
@Sven: filter 是一个几百行的 C++ 程序,处理大约 10GB 的输入……重写有点多,而且以 C++ 的速度进行快速编辑/测试很方便回转。也就是说,在一份不平凡的工作中多加一个
Popen/cat并不是什么大问题,只是感觉很草率:-}。
标签: python pipe concatenation popen