我有一个从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?
答案 0 :(得分:4)
因为子进程的'stdin'和'stdout'采用文件描述符(这是一个数字),这是一个操作系统资源。如果你传递一个对象,子进程模块会检查对象是否具有'fileno'属性,如果它有,则它会使用它。
'gzip'对象不是操作系统提供的。一个打开的文件是,socket是,管道是。 Gzip对象是一个提供read()和write()方法但没有fileno属性的对象。
您可以查看子进程的communic()方法,但您可能想要使用它。