我想使用匿名管道在Linux中的两个进程之间通信腌制对象。我不想使用subprocess
模块,而是手动创建必要的管道,然后调用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)
显示管道为空。我的问题:文件对象创建过程中发生了什么,为什么它不适用于管道?有没有办法以这种方式获取文件对象?
答案 0 :(得分:2)
您遇到了两个问题。首先,默认情况下缓冲由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个字节,然后重新组合。