我可以在Python中使用带有Popen的已打开的gzip文件吗?

时间:2010-04-28 20:15:20

标签: python scripting subprocess

我有一个从stdin读取的命令行工具。 在命令行上我会运行...

./foo < bar

或......

cat bar | ./foo

使用gziped文件我可以运行

zcat bar.gz | ./foo
在Python中我可以做...

Popen(["./foo", ], stdin=open('bar'), stdout=PIPE, stderr=PIPE)

但我做不到

import gzip
Popen(["./foo", ], stdin=gzip.open('bar'), stdout=PIPE, stderr=PIPE)

我最终不得不跑

p0 = Popen(["zcat", "bar"], stdout=PIPE, stderr=PIPE)
Popen(["./foo", ], stdin=p0.stdout, stdout=PIPE, stderr=PIPE)

我做错了吗? 为什么我不能使用gzip.open('bar')作为对Popen的stdin arg?

1 个答案:

答案 0 :(得分:4)

因为子进程的'stdin'和'stdout'采用文件描述符(这是一个数字),这是一个操作系统资源。如果你传递一个对象,子进程模块会检查对象是否具有'fileno'属性,如果它有,则它会使用它。

'gzip'对象不是操作系统提供的。一个打开的文件是,socket是,管道是。 Gzip对象是一个提供read()和write()方法但没有fileno属性的对象。

您可以查看子进程的communic()方法,但您可能想要使用它。