georep: python2 to python3 compat - pickle

Handle py2 and py3 compatibility for pickling and unpickling.
Geo-rep pickles and unpickles reading sys.stdin and sys.stdout streams.
py2 and py3 compatibility expects the streams to be opened in binary 
mode but the sys.stdout objects are different in python2
and python3

python2:
>>> type(sys.stdout)
<type 'file'>

python3:
>>> type(sys.stdout)
<class '_io.TextIOWrapper'>

So in order to access binary stream, using sys.stdin.buffer in python3

Updates: #411
Change-Id: I1a633ccdddff5baf0cf05a8b493add39ddf75bd7
Signed-off-by: Kotresh HR <khiremat@redhat.com>
This commit is contained in:
Kotresh HR 2018-09-28 06:11:52 -04:00 committed by Amar Tumballi
parent d06bbb617e
commit ff00ce1d55

View File

@ -8,6 +8,7 @@
# cases as published by the Free Software Foundation.
#
import _io
import os
import sys
import time
@ -28,13 +29,13 @@ except ImportError:
from syncdutils import Thread, select, lf
pickle_proto = -1
pickle_proto = 2
repce_version = 1.0
def ioparse(i, o):
if isinstance(i, int):
i = os.fdopen(i)
i = os.fdopen(i, 'rb')
# rely on duck typing for recognizing
# streams as that works uniformly
# in py2 and py3
@ -54,8 +55,15 @@ def send(out, *args):
def recv(inf):
"""load an object from input stream"""
return pickle.load(inf)
"""load an object from input stream
python2 and python3 compatibility, inf is sys.stdin
and is opened as text stream by default. Hence using the
buffer attribute
"""
if isinstance(inf, _io.TextIOWrapper):
return pickle.load(inf.buffer)
else:
return pickle.load(inf)
class RepceServer(object):