我正在使用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
有没有办法创建一个“包装”以前创建的类文件对象的文件对象?
答案 0 :(得分:2)
解决方案是使用os.dup()
创建引用同一管道的另一个文件描述符:
status = os.fdopen(os.dup(p.stdout.fileno()))
这样,status
有自己的文件描述符要关闭。