如何在 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)
我正在尝试通过 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)