Fix for Python 2 and 3 on Windows, see #1037.

This commit is contained in:
T.Rzepka
2018-02-17 13:49:10 +01:00
parent afee465518
commit 99130e7664
2 changed files with 29 additions and 8 deletions
+29 -6
View File
@@ -2,6 +2,8 @@
To ensure compatibility from Python ``2.7`` - ``3.x``, a module has been To ensure compatibility from Python ``2.7`` - ``3.x``, a module has been
created. Clearly there is huge need to use conforming syntax. created. Clearly there is huge need to use conforming syntax.
""" """
import binascii
import errno
import sys import sys
import imp import imp
import os import os
@@ -434,14 +436,35 @@ if sys.version_info[:2] == (3, 3):
_PICKLE_PROTOCOL = 2 _PICKLE_PROTOCOL = 2
is_windows = sys.platform == 'win32'
def pickle_load(file): def pickle_load(file):
if is_py3: if is_windows:
return pickle.load(file, encoding='bytes') try:
data = file.readline()
data = binascii.unhexlify(data.strip())
if is_py3:
return pickle.loads(data, encoding='bytes')
else:
return pickle.loads(data)
except OSError:
raise EOFError()
else: else:
return pickle.load(file) if is_py3:
return pickle.load(file, encoding='bytes')
else:
return pickle.load(file)
def pickle_dump(data, file): def pickle_dump(data, file):
pickle.dump(data, file, protocol=_PICKLE_PROTOCOL) if is_windows:
try:
data = pickle.dumps(data, protocol=_PICKLE_PROTOCOL)
data = binascii.hexlify(data)
file.write(data)
file.write(b'\n')
file.flush()
except OSError:
raise IOError(errno.EPIPE)
else:
pickle.dump(data, file, protocol=_PICKLE_PROTOCOL)
file.flush()
@@ -187,7 +187,6 @@ class _CompiledSubprocess(object):
data = evaluator_id, function, args, kwargs data = evaluator_id, function, args, kwargs
try: try:
pickle_dump(data, self._process.stdin) pickle_dump(data, self._process.stdin)
self._process.stdin.flush()
except (socket.error, IOError) as e: except (socket.error, IOError) as e:
# Once Python2 will be removed we can just use `BrokenPipeError`. # Once Python2 will be removed we can just use `BrokenPipeError`.
if e.errno != errno.EPIPE: if e.errno != errno.EPIPE:
@@ -283,7 +282,6 @@ class Listener(object):
result = True, traceback.format_exc(), e result = True, traceback.format_exc(), e
pickle_dump(result, file=stdout) pickle_dump(result, file=stdout)
stdout.flush()
class AccessHandle(object): class AccessHandle(object):