如何将 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
有没有办法创建一个“包装”先前创建的类文件对象的文件对象?
I'm calling a child process using subprocess.Popen
(Python 2.x on a POSIX system). I want to be able to read the output of the child process using Python's readline()
file object function. However, the stream available in Popen.stdout
does not appear to have a readline()
method.
Using the idea from Python readline from pipe on Linux, I tried the following:
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
However, the problem with this method is that both the p.stdout
object and the new status
object attempt to close the single file descriptor. This eventually results in:
close failed: [Errno 9] Bad file number
Is there a way to create a file object that "wraps" a previously created file-like object?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
解决方案是使用 os.dup() 创建另一个引用同一管道的文件描述符:
这样,status 就有自己的要关闭的文件描述符。
The solution is to use
os.dup()
to create another file descriptor referring to the same pipe:This way,
status
has its own file descriptor to close.