У меня есть два сценария python: object_generator.py, который распевает данный объект и печатает его. Другой скрипт object_consumer.py выбирает вывод первого скрипта через subprocess.communicate и пытается разложить его с помощью pickle.loads. У меня возникли проблемы с этой простой работой. Это мой код:Передача вывода маринованного объекта между скриптами python через subprocess.communicate
object_generator.py
import pickle
import base64
o = {'first':1,'second':2,'third':3,'ls':[1,2,3]}
d = pickle.dumps(o)
print(d)
#Various Approaches I had tried, none of which worked. Ignore this part.
#s = base64.b64decode(d)
#encoded_str = str(d).encode('ascii')
#print('encoded str is :')
#print(encoded_str)
#decoded_str = encoded_str.decode('ascii')
#print('decoded str is :')
#print(decoded_str)
#unpickled_obj = pickle.loads(bytes(decoded_str))
#print(unpickled_obj)
#print(type(d))
#print(codecs.decode(d))
object_consumer.py
import pickle
import subprocess
import os
dr = '"' + os.path.dirname(os.path.abspath(__file__)) + '\\object_generator.py"'
cmd = 'python -u ' + dr
proc = subprocess.Popen(cmd,stdout=subprocess.PIPE)
try:
outs, errs = proc.communicate(timeout=15)
except TimeoutExpired:
proc.kill()
outs, errs = proc.communicate()
# 'out' at this point is something like this :
# b"b'\\x80\\x03}q\......x05K\\x03u.'\r\n"
# DO SOMETHING WITH outs to get back the bytes which can then be
# unpickled using pickle.loads
obj = pickle.loads(outs)
print(obj)
Очевидно, что мне нужно сдирать трейлинг \ г \ п, которое легко, но то, что должно быть сделано следующий?
делает ваши усилия на цель, имеющая работу сценария, используя й очень заданного 'subprocess' модуль метод' .communicate() ', или вы открыты для реализовать python-процесс-коммуникационное решение, используя «подпроцесс» или другие средства? – user3666197
Я попробовал subprocess.check_ouput, а затем перешел на связь, когда это не сработало, но у меня нет ограничений на использование связи. Я был бы признателен за любой альтернативный метод, а также объяснение того, что в этом нет. –
Всегда полезно отделить проблему от процесса к процессу связи из проблем представления/кодирования/кодирования/кадрирования полезной нагрузки. Для первого может оказаться полезным получить обзор быстрого и масштабируемого обмена сообщениями между процессами ** ZeroMQ ** (со многими портами, включая python), где вы получаете все полномочия под своим контролем, чтобы быть в состоянии для соответствия архетипов коммуникации в распределенной параллельной обработке потребностей Проекта. – user3666197