Python:从stdin读取和写入Powershell中的二进制文件

Python:从stdin读取和写入Powershell中的二进制文件,python,python-3.x,powershell,stdout,stdin,Python,Python 3.x,Powershell,Stdout,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 __

我有以下两个用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上的输出(在pwsh.exe下运行):

Linux上的输出(这是正确的):

你知道为什么会这样吗?是新剧结尾还是类似的

另外,在cat.py中,如果我写入一个文件而不是标准输出,我确实会得到写入文件的正确内容


更新:


好吧,我把范围缩小到了一个powershell问题。如果我在cmd.exe中运行此命令,我不会有任何问题,但是,如果我在powershell下运行它,我会有问题。

很可能两个命令行都设置了不同的编码,这会导致不同的数据流

不幸的是,即使您以二进制形式从stdin读入,它也必须通过命令行,并且通常会受到系统范围编码设置的影响


有一个可以帮助解决这个问题的方法。

我们是说Python3还是Python2?对不起,我没有提到,我使用的是Python 3I,我看了答案,它确实提到了我正在使用的sys.stdin.buffer和sys.stdout.buffer。这与系统范围的编码有关,尽管两者都使用相同的编码,powershell会破坏它,因为它错误地解释了来自python应用程序的编码。powershell不理解Python默认的UTF-8。
0x3
0xc2
0xb7
0x55
0x12
0x20
0x66
0x67
0x50
0xc3
0x9e
0xc2
0xbd
0xd
0xa
0x3
0xfa
0x55
0x12
0x20
0x66
0x67
0x50
0xe8
0xab