加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

在python中将文件描述符(管道)转换为文件对象

发布时间:2020-12-17 17:39:39 所属栏目:Python 来源:网络整理
导读:我想使用匿名管道在Linux中的两个进程之间通信腌制对象.我不想使用子流程模块,而是手动创建必要的管道,然后调用pickle.dump和pickle.load.但是,最后两个函数需要一个文件对象.因此,在测试周围事物时,我面临以下问题.以下代码可以正常工作: import osr,w = o

我想使用匿名管道在Linux中的两个进程之间通信腌制对象.我不想使用子流程模块,而是手动创建必要的管道,然后调用pickle.dump和pickle.load.但是,最后两个函数需要一个文件对象.因此,在测试周围事物时,我面临以下问题.以下代码可以正常工作:

import os
r,w = os.pipe()
os.write(w,b"test")
os.read(r,1024)

但是此代码在读取操作时停滞

import os
r,w = os.pipe()
fr = os.fdopen(r,"rb")
fw = os.fdopen(w,"wb")
fw.write(b"test")
fr.read()

此外,select.select([r],[],0)显示管道为空.我的问题:文件对象创建过程中发生了什么,为什么它不适用于管道?有没有办法以这种方式获取文件对象?

最佳答案
您遇到了两个问题.首先,默认情况下缓冲由os.fdopen创建的文件对象.使其无缓冲:

fr = os.fdopen(r,"rb",buffering=0)
fw = os.fdopen(w,"wb",buffering=0)

或刷新写入的数据:

fw.write(b"test")
fw.flush()

第二,函数fr.read()在不带参数的情况下读取到文件末尾.对于管道,是指直到管道关闭.您应该传递要读取的字节数:

fr.read(4)
> b'test'

如果不确定要写入多少数据,请分段读取,每次调用N个字节,然后重新组合.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读