2017-03-06 72 views
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對我來說似乎很理想。

感謝

+0

你怎麼樣先發送對象來的大小,然後讀取從大小服務器中的緩衝區? – Netwave

+0

@DanielSanchez我不太明白,服務器端沒有緩衝區?我可以從中讀出所發送的所有內容。但是閱讀整個字符串不是問題。我想恢復原始對象。 – Kilsen

+0

@Kilsen你是否在作家'sys.stdout.write(string)'中嘗試過,而沒有轉換爲'str'? – kazemakase

回答

1

可以使用pickle當元帥的數據,而不是sys.stdout.buffersys.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)