Pythonで書かれた次の2つのプログラムがあります
# 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)
このプログラムはファイルを読み取り、それをバイナリとしてstdoutに出力します。
次のプログラムは、データを読み取ってバイトとして出力することを目的としています。
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でstdoutではなくファイルに書き込むと、正しい内容がファイルに書き込まれます。
更新:
さて、私はそれをpowershellの問題であると絞り込みました。これをcmd.exeで実行する場合、問題はありませんが、Powershellで実行する場合は実行します。
両方のコマンドラインに異なるエンコーディングが設定されている可能性があり、その結果、異なるデータストリームが発生する可能性があります。
残念ながら、stdinからバイナリとして読み込んだ場合でも、コマンドラインを経由する必要があり、通常、システム全体に影響するエンコード設定があります。
ある答えは、この問題の解決に役立つはずです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加