Python:从标准输入读取和写入 Powershell 中的二进制文件
Python: Reading and Writing to a binary file in Powershell from stdin
我在Python
中写了下面两个程序
# cat.py
import sys
filename = sys.argv[1]
with open(filename, "rb") as f:
while c := f.read(1024 * 1024):
sys.stdout.buffer.write(c)
此程序读取文件并将其作为二进制文件输出到标准输出。
以下程序用于读取数据并将其打印为字节。
import sys
import io
if __name__ == '__main__':
print(sys.stdin.buffer.read(io.DEFAULT_BUFFER_SIZE))
但是在这种情况下我没有得到文件内容。如果我 运行 这个在 Linux 下,我确实得到了确切的内容但是如果我 运行 这个在 windows 我没有:
python cat.py .\inputs\input.bin | python main.py
Windows 上的输出(运行ning 在 pwsh.exe 下):
0x3
0xc2
0xb7
0x55
0x12
0x20
0x66
0x67
0x50
0xc3
0x9e
0xc2
0xbd
0xd
0xa
Linux 上的输出(这是正确的):
0x3
0xfa
0x55
0x12
0x20
0x66
0x67
0x50
0xe8
0xab
知道为什么会这样吗?是换行结尾还是类似的东西?
此外,在 cat.py 中,如果我写入文件而不是标准输出,我确实将正确的内容写入文件。
更新:
好的,我已将其缩小为 powershell 问题。如果我 运行 这个在 cmd.exe 我没有任何问题,但是,如果我 运行 它在 powershell 下我有。
可能是为两个命令行设置了不同的编码,这会导致不同的数据流。
不幸的是,即使您以二进制形式从 stdin 读取,它也必须通过命令行,并且通常有一个 system-wide 编码设置会影响它。
有一个 answer 应该有助于解决这个问题。
我在Python
中写了下面两个程序# cat.py
import sys
filename = sys.argv[1]
with open(filename, "rb") as f:
while c := f.read(1024 * 1024):
sys.stdout.buffer.write(c)
此程序读取文件并将其作为二进制文件输出到标准输出。
以下程序用于读取数据并将其打印为字节。
import sys
import io
if __name__ == '__main__':
print(sys.stdin.buffer.read(io.DEFAULT_BUFFER_SIZE))
但是在这种情况下我没有得到文件内容。如果我 运行 这个在 Linux 下,我确实得到了确切的内容但是如果我 运行 这个在 windows 我没有:
python cat.py .\inputs\input.bin | python main.py
Windows 上的输出(运行ning 在 pwsh.exe 下):
0x3
0xc2
0xb7
0x55
0x12
0x20
0x66
0x67
0x50
0xc3
0x9e
0xc2
0xbd
0xd
0xa
Linux 上的输出(这是正确的):
0x3
0xfa
0x55
0x12
0x20
0x66
0x67
0x50
0xe8
0xab
知道为什么会这样吗?是换行结尾还是类似的东西?
此外,在 cat.py 中,如果我写入文件而不是标准输出,我确实将正确的内容写入文件。
更新:
好的,我已将其缩小为 powershell 问题。如果我 运行 这个在 cmd.exe 我没有任何问题,但是,如果我 运行 它在 powershell 下我有。
可能是为两个命令行设置了不同的编码,这会导致不同的数据流。
不幸的是,即使您以二进制形式从 stdin 读取,它也必须通过命令行,并且通常有一个 system-wide 编码设置会影响它。
有一个 answer 应该有助于解决这个问题。