如何将readline()与subprocess.Popen返回的管道一起使用

时间:2011-12-28 21:51:55

标签: python subprocess pipe readline

我正在使用subprocess.Popen(POSIX系统上的Python 2.x)调用子进程。我希望能够使用Python的readline()文件对象函数读取子进程的输出。但是,Popen.stdout中可用的流似乎没有readline()方法。

使用Python readline from pipe on Linux中的想法,我尝试了以下内容:

p = subprocess.Popen(
    [sys.executable, "child.py"],
    stdout=subprocess.PIPE)
status = os.fdopen(p.stdout.fileno())
while True:
    s = status.readline()
    if not s:
        break
    print s

但是,此方法的问题是 p.stdout对象和新的status对象尝试关闭单个文件描述符。这最终导致:

close failed: [Errno 9] Bad file number

有没有办法创建一个“包装”以前创建的类文件对象的文件对象?

1 个答案:

答案 0 :(得分:2)

解决方案是使用os.dup()创建引用同一管道的另一个文件描述符:

status = os.fdopen(os.dup(p.stdout.fileno()))

这样,status有自己的文件描述符要关闭。