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

标签 python python-3.x

我想使用匿名管道在 linux 中的两个进程之间传递 pickled 对象。我不想使用 subprocess 模块,而是手动创建必要的管道,然后调用 pickle.dumppickle.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 个字节,然后重新组合。

关于python - 将文件描述符(管道)转换为python中的文件对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55150677/

相关文章:

python - 如何在 Pyke 中断言负面事实?

python pandas 选择两列(不)相等的行

java - 通过套接字接收的字符串在 python 中不进行比较

python - 什么是 "@"在 Python 函数之上的装饰器?

python - 无法让狮身人面像在 toctree 下链接到另一个文档

python - 如何在代码中初始化 UTF-16?

python - 如何将 numpy 数组的多个值添加到图例中?

python - 在django中上传到s3之前如何压缩图像?

python - 需要在列表中查找字符数超过一定数量的字符串

python-3.x - 为什么 spaCy 不像斯坦福 CoreNLP 那样在标记化过程中保留单词内连字符?