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

1 投票
1 回答
3534 浏览
提问于 2025-04-17 09:10

我正在使用 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 就有了自己的文件描述符,可以单独关闭。

撰写回答