2017-03-06 6 views
0

J'essaie d'envoyer un tableau numpy sur stdout d'un processus à un autre.Comment envoyer un byte-objet sur un tuyau en python?

L'envoyer sur le tuyau nécessite que je le convertisse en chaîne. De l'autre côté, je reçois un objet octet. Cet objet octet a maintenant la chaîne d'octets originale encapsulée.

Je trouve qu'il est maintenant impossible de restaurer l'objet original en tant qu'objet octet. Si je décode l'objet byte, je reçois une chaîne incompatible avec toutes les fonctions de restauration que j'ai essayées (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() 

est-il de toute façon de convertir la chaîne en un byteobject, sans encoder? Comment cela pourrait-il fonctionner autrement? Je veux utiliser des tuyaux au lieu de la mémoire partagée comme proposé dans d'autres solutions pour le garder plus simple. De plus, j'ai besoin d'être parallèle mais bloquant, donc Pipes m'a semblé idéal.

Merci

+0

que diriez-vous que vous envoyez d'abord la taille de l'objet à venir, alors que la taille de lecture le tampon dans le serveur? – Netwave

+0

@DanielSanchez Je ne comprends pas très bien, il n'y a pas de tampon côté serveur? Il y a la stdout à partir de laquelle je peux lire tout ce qui a été envoyé. Mais lire toute la chaîne n'est pas le problème. Je veux restaurer l'objet original. – Kilsen

+0

@Kilsen avez-vous essayé dans l'auteur 'sys.stdout.write (string)' sans convertir en 'str'? – kazemakase

Répondre

1

vous pouvez utiliser pickle pour rassembler les données et sys.stdout.buffer au lieu de sys.stdout écrire octets à stdout.

Référence: 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)