我有一个 python 进程(比如 abc.py),它打印一个 latin1 编码的 pickle 输出,其中包含 \n
这是生成二进制 pickle 输出的代码
byte_array = pickle.dumps(result)
#Windows uses utf-8 encoding by default
# http://stackoverflow.com/a/4374457/2073595
# http://stackoverflow.com/a/26220050/1873328
sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding='latin-1')
print(byte_array.decode('latin-1'), end='', flush=True)
输出的格式如下
...00USR_RDER_TYPEq\x06X\n\x00\x00\x00VERSION_.....
注意这个二进制字符串包含\n
我有另一个 sublime 插件,它使用 suprocess.Popen 运行上面的脚本并使用 communications 获取 pickled 输出
db_process = subprocess.Popen('python -u abc.py',stdout=subprocess.PIPE,cwd=scripts_folder,shell=True,universal_newlines=False)
try:
output, errs = db_process.communicate(timeout=15)
except TimeoutExpired:
db_process.kill()
output, errs = db_process.communicate()
#unpickle the output
obj = pickle.loads(output)
我的问题是,在变量 output
中,\n
更改为 \r\n
,即上面的 pickle 输出将是收到为
...00USR_RDER_TYPEq\x06X\r\n\x00\x00\x00VERSION_....
这会导致取消 pickle 时出现问题。我无法替换出现的情况,因为它是二进制字符串。我该如何解决这个问题?
PS:我使用的是python 3.4
最佳答案
我不知道如何删除从 \n
到 \r\n
的转换。
但是您可以对其进行编码和解码,这样就没有空格或者它们无关紧要。
import base64
byte_array = pickle.dumps(result)
print(base64.b64encode(byte_array))
然后您需要恢复编码。
import base64
obj = pickle.loads(base64.b64decode(output))
关于windows中的python打印函数将\n转换为\r\n。如何预防呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26906744/