简体   繁体   English

在python进程之间传递二进制数据

[英]Pass binary data between python processes

I need to transfer binary data between python processes on linux efficiently. 我需要在linux上的python进程之间有效地传输二进制数据。 However I can't find a way to pass it with pipe. 但是我找不到用管道传递它的方法。 The closest I got was to pass it as string but it keeps its binary form for some reason so it causes me problems. 我得到的最接近的是将其作为字符串传递,但由于某种原因它保留了二进制形式,因此它给我带来了问题。

ciphertext, tag = cipher1.encrypt_and_digest(input().encode())
print(ciphertext)

ciphertext is binary but when I test its type at the other process 密文是二进制的,但是当我在另一个进程中测试它的类型时

print(type(sys.stdin.read()))

I get 我明白了

<class 'str'>

Any ideas? 有任何想法吗?

In Python 3 you can't use print or input for binary data. 在Python 3中,您不能使用printinput二进制数据。 They're designed for handling text (Unicode), not binary. 它们的设计用于处理文本(Unicode),而不是二进制文件。 You can use file .write and .read calls to sys.stdout.buffer and sys.stdin.buffer , which are the underlying binary buffers to stdin and stdout. 您可以使用文件.write.read调用sys.stdout.buffersys.stdin.buffer ,它们是stdin和stdout的基础二进制缓冲区。 You can't use sys.stdout and sys.stdin since they're for text. 您不能使用sys.stdoutsys.stdin因为它们用于文本。 There's a brief Note about this at the end of the docs for sys.stdin and sys.stdout . sys.stdin和sys.stdout文档末尾有一个简短的注释。

Here's a short demo. 这是一个简短的演示。

In "send_bytes.py" we create a bytes string data that contains all the possible byte values and write it to sys.stdout.buffer . 在“send_bytes.py”中,我们创建一个包含所有可能字节值的bytes字符串data ,并将其写入sys.stdout.buffer We pipe that output to "get_bytes.py" where we read it and check to make sure it has all the right bytes in the right places. 我们将输出管道输出到“get_bytes.py”,在那里我们读取它并检查以确保它在正确的位置具有所有正确的字节。

send_bytes.py send_bytes.py

#! /usr/bin/env python3

''' Write some binary data to stdout '''

import sys

# Make a bytes string containing all possible byte values
data = bytes(range(256))

#Send it as binary to stdout
out = sys.stdout.buffer
out.write(data)

get_bytes.py get_bytes.py

#! /usr/bin/env python3

''' Read some binary data from stdin '''

import sys

#Read binary data from stdin
infile = sys.stdin.buffer
newdata = infile.read()

print(newdata)

# Make a bytes string containing all possible byte values
data = bytes(range(256))

#Check that the read data is correct
print(newdata == data)    

We run the programs using this command line: 我们使用以下命令行运行程序:

$ python3 ./send_bytes0.py | python3 ./get_bytes0.py   

Here's the output printed by "get_bytes0.py" 这是“get_bytes0.py”打印的输出

b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'
True

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM