如何在 python 中通过管道发送字节对象?

How can I send a byte-object over a pipe in python?

我正在尝试通过 stdout 从一个进程向另一个进程发送一个 numpy 数组。

通过管道发送它需要我将它转换为字符串。 另一方面,我收到一个字节对象。此字节对象现在封装了原始字节字符串。

我发现现在无法将原始字节对象还原为字节对象。 如果我解码字节对象,我会收到一个与我尝试过的所有恢复函数不兼容的字符串(np.frombuffer、pickle.loads)。

server.py

import subprocess
import numpy as np
p = subprocess.Popen(['python3', 'writer.py'], stdout=subprocess.PIPE)

while 1:
    tmp = p.stdout.readline()    
    # doesn't fail but wrong size
    array = np.frombuffer(tmp, dtype=np.uint8)
    tmp = bytes.decode(tmp)
    # fails because byte object is necessary
    array = np.frombuffer(tmp, dtype=np.uint8)
    array = array.reshape([1, 3, 5, 5, 1])
    print(array.shape)

writer.py

import numpy as np
import sys
while 1:
    array = np.zeros([1, 3, 5, 5, 1], dtype=np.int8)
    string = array.tobytes()
    sys.stdout.write(str(string))
    sys.stdout.flush()

有没有办法将字符串转换为字节对象而不对其进行编码? 这怎么可能呢? 我想使用管道而不是其他一些解决方案中建议的共享内存,以使其更简单。此外,我需要它是并行但阻塞的,所以 Pipes 对我来说似乎是理想的。

谢谢

您可以使用 pickle 编组数据,并使用 sys.stdout.buffer 而不是 sys.stdout 将字节写入标准输出。

参考:sys.stdout

server.py:

import subprocess
import numpy as np
import pickle
p = subprocess.Popen(['python3', 'writer.py'], stdout=subprocess.PIPE)

while 1:
  array = pickle.load(p.stdout)
  array = array.reshape([1, 3, 5, 5, 1])
  print(array.shape)

writer.py:

import numpy as np
import pickle
import sys
while 1:
  array = np.zeros([1, 3, 5, 5, 1], dtype=np.int8)
  pickle.dump(array, sys.stdout.buffer)