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

Python 如何将readline()与subprocess.Popen返回的管道一起使用,python,subprocess,pipe,readline,Python,Subprocess,Pipe,Readline,我正在使用subprocess.Popen(POSIX系统上的Python 2.x)调用一个子进程。我希望能够使用Python的readline()file对象函数读取子进程的输出。但是,Popen.stdout中可用的流似乎没有readline()方法 利用来自的想法,我尝试了以下方法: p = subprocess.Popen( [sys.executable, "child.py"], stdout=subprocess.PIPE) status = os.fdopen(p

我正在使用
subprocess.Popen
(POSIX系统上的Python 2.x)调用一个子进程。我希望能够使用Python的
readline()
file对象函数读取子进程的输出。但是,
Popen.stdout
中可用的流似乎没有
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

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

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

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

通过这种方式,
status
有自己的文件描述符要关闭。

令人惊讶的是,仅仅写一个问题就能让答案变得显而易见。你如何得到
p.stdout
,它有
.fileno()
但没有
.readline()
方法?@J.F.Sebastian:这是个好问题。我刚刚再试了一次,
p.stdout.readline()
工作正常。可能是我错误地尝试了
p.readline()
,这有点尴尬。