Python:从stdin读取和写入Powershell中的二进制文件
我有以下两个用Python编写的程序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 __
# 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