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()
,这有点尴尬。