如何使用readline()与subprocess.Popen返回的管道
我正在使用 subprocess.Popen
来调用一个子进程(在 POSIX 系统上的 Python 2.x)。我想用 Python 的 readline()
函数来读取这个子进程的输出。不过,Popen.stdout
提供的流似乎没有 readline()
这个方法。
我参考了这个链接中的想法:在 Linux 上从管道读取 Python 的 readline,然后尝试了以下代码:
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 个回答
2
解决办法是使用 os.dup()
来创建一个新的文件描述符,这个新的描述符指向同一个管道:
status = os.fdopen(os.dup(p.stdout.fileno()))
这样一来,status
就有了自己的文件描述符,可以单独关闭。