のPython 2.xでは、私はこれを行うことができます: python 3のstdoutにバイナリデータを書き込む方法は?
import sys, array
a = array.array('B', range(100))
a.tofile(sys.stdout)
は今しかし、私は
TypeError: can't write bytes to text stream
を取得します。私が使うはずの秘密のコードがありますか?
のPython 2.xでは、私はこれを行うことができます: python 3のstdoutにバイナリデータを書き込む方法は?
import sys, array
a = array.array('B', range(100))
a.tofile(sys.stdout)
は今しかし、私は
TypeError: can't write bytes to text stream
を取得します。私が使うはずの秘密のコードがありますか?
良い方法:あなたはまだ以下のようなバイトのコマンドを使用することができますのpython3でエンコードを指定したい場合には
import sys
sys.stdout.buffer.write(b"some binary data")
'sys.stdout.buffer'を使うと、ソースファイルオブジェクトが文字列ではなくバイトを与えるときでも、' shutil.copyfileobj'のようなことをすることができます。 +1 – csl
これを使用するプログラムは、IDLE 3でテストすることはできません。 'AttributeError: 'PseudoOutputFile'オブジェクトに 'buffer'属性がありません。 –
IDLEの@DamianYerrick(Windowsでは少なくとも)' pythonw.exe'はIDLEを実行します。 stdoutがないこと。これはtkinterでエミュレートされます。物理的にはバイトを処理できません。この場合、IDLEを使用する代わりに '.decode( 'UTF-8'、errors = 'replace')'文字列を実行するか、 'python3 -I
import os
os.write(1, a.tostring())
または、os.write(sys.stdout.fileno(), …)
それはあなたのために1
よりも読みやすいかどう。
ありがとう、それは働いた。ちょっとハック・アイスだと思うけど、そうするのはそれが普通のことではないと思う。 –
'os.write'の問題は、すべてが書き込まれることを保証するものではないので、戻り値をチェックする必要があるということです。 –
:
1は、対応する通常の数であるimport os
os.write(1,bytes('Your string to Stdout','UTF-8'))
stdout - > sys.stdout.fileno()の場合
エンコードを気にしない場合は、次のようにします。
import sys
sys.stdout.write("Your string to Stdout\n")
あなたは以下を使用しよう、その後、エンコードせずにos.writeを使用する場合:
import os
os.write(1,b"Your string to Stdout\n")
'os.write(sys.stdout.fileno()、some_bytes)'を使ったプログラムは、IDLEでは動作しません。 'io.UnsupportedOperation:fileno' –
@DamianYerrick:あなたは正しいです... IDLEは、とにかくそのようなものをテストするために使用されるべきではありません。まもなくIDLE(私はpython3.5.1シェルを持っていました)を開き、単純にsysとsys.stdout.fileno()をインポートしてみましょう。IDLEではこれがサポートされていないので、ioエラーがスローされます:-)常に重要ですどのような環境で作業しているかを覚えて、可能なものを手に入れよう;)これであなたの質問を明確にしたいと思っています:-)良い週末を過ごしてください。 –
Python 2.6+および3で動作します答えを見つけるためにはるかに良いでしょう。 x – sorin
'os.write'はPy2とPy3の両方で動作します。 –