无法在Python中打开由描述符创建的管道

2024-09-28 17:24:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚开始学习python的管道方法。 我试图将管道描述符包装到file对象中并逐行读取。在

import os,time,threading

def child():
    while True:
        time.sleep(1)
        msg = ('Spam\n' ).encode()
        os.write(pipeout,msg)


def parent(): 
    while True:
        a = os.fdopen(pipein)
        line = a.readline()[:-1]
        print('Parent %d got [%s] at %s' % (os.getpid(),line,time.time()))

pipein,pipeout = os.pipe()

threading.Thread(target=child,args=()).start()

parent()

当我运行脚本时,结果如下——脚本只在第一次迭代中工作,然后显示错误消息

^{pr2}$

但是,当我改变

a = os.fdopen(pipein)
line = a.readline()[:-1]

line = os.read(pipein,32)

这些通货很好用。在

所以为什么os.fdopen操作系统“无法使用方法?为什么管子坏了?谢谢大家!在


Tags: 方法childtrue管道timeosdefline
1条回答
网友
1楼 · 发布于 2024-09-28 17:24:41

问题在于os.fdopen的位置:

def parent(): 
    while True:
        a = os.fdopen(pipein)
        line = a.readline()[:-1]
        print('Parent %d got [%s] at %s' % (os.getpid(),line,time.time()))

每次遍历循环时,您都会再次调用os.fdopen(),即使您以前这样做过。在

第一次这样做时,您没有做任何较早的os.fdopen(),所以一切都很好。但是第二次,这会将a重新绑定到新结果,放弃了先前的os.fdopen()值。在

当前面的值被放弃时,它就有资格进行垃圾回收。CPython立即通知(由于引用计数)并收集它。这将删除调用os.fdclose()的底层对象。这反过来又关闭了管道。在

要解决当前的问题,请确保只在循环外打开管道一次。在

相关问题 更多 >