두 개의 python 스크립트가 있습니다. object_generator.py는 지정된 객체를 pickle하고 인쇄합니다. 또 다른 스크립트 object_consumer.py는 subprocess.communicate를 통해 첫 번째 스크립트의 출력을 선택하고 pickle.loads를 사용하여 unpickle을 시도합니다. 이 간단한 시나리오 작업을하는 데 문제가 있습니다. 분명히subprocess.communicate를 통해 python 스크립트간에 피클 링 된 객체 출력 전송
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)
, 나는 쉽지만 무엇을 수행해야 후행 \ r \ n을 벗겨해야이 내 코드입니다 다음 것?
이 일이 매우 주어진'subprocess' 모듈 방식'.communicate를 (사용 시나리오 작업을 할 수 데에 당신의 노력 목표를 하는가를) ', 또는 당신은 열려 있습니다 '서브 프로세스 (subprocess) '또는 다른 수단을 사용하여 파이썬 프로세스 간 통신 솔루션을 구현할 수 있습니까? – user3666197
나는 subprocess.check_ouput을 시도한 다음 그 didnt 작업이 통신 할 때 옮겼지만 통신을 사용할 수있는 제한이 없다. 나는 이것의 무엇이 잘못되었는지에 대한 설명과 함께 어떤 다른 방법으로도 감사 할 것입니다. –
페이로드 표현/코딩/직렬화/캡슐화/프레이밍 문제와 프로세스 간 통신 문제를 항상 구분하는 것이 좋습니다. 전자의 경우, 신속하고 확장 가능한 프로세스 간 메시징 **에 대한 개요를 얻으려면 유용 할 것입니다. ** ZeroMQ ** (제어 할 수있는 모든 권한을 얻을 수있는 많은 포트, Python 포함) 통신 아키타 입을 분산 된 병렬 처리 프로젝트 요구 사항에 맞춰야합니다. – user3666197