0
我想從一個進程向另一個進程發送一個numpy數組。如何在Python中通過管道發送字節對象?
通過管道發送它需要我將其轉換爲字符串。 另一方面,我收到一個字節對象。此字節對象現在具有封裝的原始字節字符串。
我發現現在不可能將原始字節對象恢復爲字節對象。 如果我解碼字節對象,我收到一個字符串,它與我嘗試的所有恢復函數(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()
反正是有字符串轉換成byteobject,沒有編碼的呢? 這還能工作嗎? 我想使用管道而不是共享內存,正如其他解決方案中提出的一樣,以使其更簡單。此外,我需要它平行但阻塞,所以Pipes對我來說似乎很理想。
感謝
你怎麼樣先發送對象來的大小,然後讀取從大小服務器中的緩衝區? – Netwave
@DanielSanchez我不太明白,服務器端沒有緩衝區?我可以從中讀出所發送的所有內容。但是閱讀整個字符串不是問題。我想恢復原始對象。 – Kilsen
@Kilsen你是否在作家'sys.stdout.write(string)'中嘗試過,而沒有轉換爲'str'? – kazemakase