【问题标题】:Python: Reading and Writing to a binary file in Powershell from stdinPython:从标准输入读取和写入 Powershell 中的二进制文件
【发布时间】:2020-09-25 14:03:41
【问题描述】:

我有以下两个用 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 下运行):

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 下运行它,我会这样做。

【问题讨论】:

  • 我们说的是 Python3 还是 Python2?
  • 对不起,我没有提到,我使用的是 Python 3

标签: python python-3.x powershell stdout stdin


【解决方案1】:

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

不幸的是,即使您以二进制形式从标准输入读取,它也必须通过命令行,并且通常有一个系统范围的编码设置会影响它。

有一个answer 可以帮助解决这个问题。

【讨论】:

  • 我确实看过答案,它确实提到了我正在使用的 sys.stdin.buffer 和 sys.stdout.buffer。
  • 它与系统范围的编码有关,即使两者都使用相同的编码,powershell 也会破坏它,因为它会误解 python 应用程序的编码。 powershell 不理解 Python 的默认 UTF-8。 rkeithhill.wordpress.com/2010/05/26/…
猜你喜欢
  • 2014-01-07
  • 2011-02-20
  • 2010-12-08
  • 2014-01-28
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
相关资源
最近更新 更多